Paso 6 (2)- Trayectorias de hospitalización y mortalidad con foco en condiciones vinculadas a trastornos de salud mental y consumo de sustancias posterior a un primer ingreso por alguno de estos trastornos, en usuarios/as jóvenes y adultos emergentes de población general y pertenecientes a pueblos originarios, 2018-2021, Chile

Análisis de sensibilidad para resolución trimestral, utilizando una solución con una mayor cantidad de conglomerados.

Autor/a

Andrés González Santa Cruz

Fecha de publicación

27 de ene, 2025

Configurar

Código
# remover objetos y memoria utilizada
rm(list=ls());gc()
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  598950 32.0    1344868 71.9   686445 36.7
Vcells 1138299  8.7    8388608 64.0  1876466 14.4
Código
#remover imágenes
while(!dev.cur())dev.off()
cat("\014")
Código
if(Sys.info()["sysname"]=="Windows"){
 folder_path <- ifelse(dir.exists("H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/"),
                       "H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/",
                       "C:/Users/CISS Fondecyt/Mi unidad/Alvacast/SISTRAT 2022 (github)/_proposal_grant/2023/")
} else {folder_path <- ""}
load(paste0(folder_path,"avance250117.RData"))

Paquetes estadísticos

Código
#elegir repositorio
if(Sys.info()["sysname"]=="Windows"){
  options(repos = c(CRAN = "https://cran.dcc.uchile.cl/"))
}
options(install.packages.check.source = "yes") # Chequea la fuente de los paquetes

#borrar caché
#system("fc-cache -f -v")

if(!require(pacman)){install.packages("pacman");require(pacman)}

pacman::p_unlock(lib.loc = .libPaths()) #para no tener problemas reinstalando paquetes

if(Sys.info()["sysname"]=="Windows"){
if (getRversion() != "4.4.0") { stop("Requiere versión de R 4.4.0. Actual: ", getRversion()) }
}

if(!require(job)){install.packages("job");require(job)}
if(!require(kableExtra)){install.packages("kableExtra");require(kableExtra)}
if(!require(tidyverse)){install.packages("tidyverse");require(tidyverse)}
if(!require(cluster)){install.packages("cluster"); require(cluster)}
if(!require(WeightedCluster)){install.packages("WeightedCluster"); require(WeightedCluster)}
if(!require(devtools)){install.packages("devtools"); require(devtools)}
if(!require(TraMineR)){install.packages("TraMineR"); require(TraMineR)}
if(!require(TraMineRextras)){install.packages("TraMineRextras"); require(TraMineRextras)}
if(!require(NbClust)){install.packages("NbClust"); require(NbClust)}
if(!require(haven)){install.packages("haven"); require(haven)}
if(!require(ggseqplot)){install.packages("ggseqplot"); require(ggseqplot)}
if(!require(grid)){install.packages("grid"); require(grid)}
if(!require(gridExtra)){install.packages("gridExtra"); require(gridExtra)}
if(!require(Tmisc)){install.packages("Tmisc"); require(Tmisc)}
if(!require(factoextra)){install.packages("factoextra"); require(factoextra)}
if(!require(stargazer)){install.packages("stargazer"); require(stargazer)}
if(!require(gtsummary)){install.packages("gtsummary"); require(gtsummary)}
if(!require(lmtest)){install.packages("lmtest"); require(lmtest)}
if(!require(emmeans)){install.packages("emmeans"); require(emmeans)}
if(!require(fpp2)){install.packages("fpp2"); require(fpp2)}
if(!require(purrr)){install.packages("purrr"); require(purrr)}
if(!require(forecast)){install.packages("forecast"); require(forecast)}
if(!require(magrittr)){install.packages("magrittr"); require(magrittr)}
if(!require(foreach)){install.packages("foreach"); require(foreach)}
if(!require(doParallel)){install.packages("doParallel"); require(doParallel)}
if(!require(progressr)){install.packages("progressr"); require(progressr)}
if(!require(chisq.posthoc.test)){devtools::install_github("ebbertd/chisq.posthoc.test")}
if(!require(rstatix)){install.packages("rstatix"); require(rstatix)}
if(!require(rio)){install.packages("rio"); require(rio)}
if(!require(cowplot)){install.packages("cowplot"); require(cowplot)}
if(!require(DiagrammeR)){install.packages("DiagrammeR"); require(DiagrammeR)}
if(!require(DiagrammeRsvg)){install.packages("DiagrammeRsvg"); require(DiagrammeRsvg)}
if(!require(rsvg)){install.packages("rsvg"); require(rsvg)}
if(!require(survminer)){install.packages("survminer"); require(survminer)}

seq_mean_t_dos_grupos <- function(bd = NULL, group1, group2) {
  # Agrupar por ambas variables
  resultados <- by(bd, list(group1, group2), seqmeant)
  
  # Obtener todas las combinaciones posibles de los grupos
  combinaciones <- expand.grid(group1 = unique(group1), group2 = unique(group2), stringsAsFactors = FALSE)
  
  # Extraer los resultados y asociarlos con las combinaciones
  resultados_df <- do.call(rbind, lapply(seq_along(resultados), function(i) {
    group_name1 <- attr(resultados, "dimnames")[[1]][i]
    group_name2 <- attr(resultados, "dimnames")[[2]][i]
    
    data.frame(factor_inclusivo_1 = group_name1, 
               factor_inclusivo_2 = group_name2, 
               Mean = resultados[[i]])
  }))
  
  # Unir los resultados con las combinaciones para rellenar los valores faltantes
  final_df <- merge(combinaciones, resultados_df, by.x = c("group1", "group2"), 
                    by.y = c("factor_inclusivo_1", "factor_inclusivo_2"), all.x = TRUE)
  
  return(final_df)
}

multinom_pivot_wider <- function(x) {
  # check inputs match expectatations
  # create tibble of results
  df <- tibble::tibble(outcome_level = unique(x$table_body$groupname_col))
  df$tbl <- 
    purrr::map(
      df$outcome_level,
      function(lvl) {
        gtsummary::modify_table_body(
          x, 
          ~dplyr::filter(.x, .data$groupname_col %in% lvl) %>%
            dplyr::ungroup() %>%
            dplyr::select(-.data$groupname_col)
        )
      }
    )
  
  tbl_merge(df$tbl, tab_spanner = paste0("**", df$outcome_level, "**"))
}

best_subset_multinom <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores
  predictors_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de predictores
  for (i in seq_along(predictors_list)) {
    predictors <- predictors_list[[i]]
    formula <- as.formula(paste(y, "~", paste(predictors, collapse = "+")))
    
    # Ajustar el modelo multinomial
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL
    )
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      # Extraer el AIC del modelo
      aic <- AIC(model)
      
      # Almacenar la información en una lista
      results[[length(results) + 1]] <- list(
        predictors = predictors,
        model = model,
        AIC = aic
      )
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = paste(res$predictors, collapse = "+"),
        AIC = res$AIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por AIC de menor a mayor
  results_df <- results_df %>% arrange(AIC)
  
  return(results_df)
}
best_subset_multinom_interactions <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de efectos principales
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- list()
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Combinar efectos principales e interacciones
    all_terms <- c(main_effects, interaction_terms)
    
    # Generar todas las combinaciones posibles de términos (incluyendo interacciones)
    # Solo se incluyen interacciones si sus efectos principales están presentes
    term_combinations <- list()
    
    # Obtener todos los subconjuntos de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Incluir interacciones solo si todos sus efectos principales están incluidos
      possible_interactions <- interaction_terms[
        sapply(interaction_terms, function(x) {
          vars_in_interaction <- unlist(strsplit(x, ":"))
          all(vars_in_interaction %in% me)
        })
      ]
      
      # Generar todas las combinaciones de interacciones para incluir
      interaction_subsets <- list(NULL)
      if (length(possible_interactions) > 0) {
        interaction_subsets <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
      }
      
      # Para cada combinación de interacciones, crear el conjunto completo de términos
      for (ints in interaction_subsets) {
        if (is.null(ints)) {
          full_terms <- terms
        } else {
          full_terms <- c(terms, ints)
        }
        
        # Añadir a la lista de combinaciones de términos
        term_combinations <- append(term_combinations, list(full_terms))
      }
    }
    
    # Ajustar modelos para cada combinación de términos
    for (terms in term_combinations) {
      formula <- as.formula(paste(y, "~", paste(terms, collapse = "+")))
      
      # Ajustar el modelo multinomial
      model <- tryCatch(
        nnet::multinom(formula, data = data, trace = FALSE),
        error = function(e) NULL,
        warning = function(w) NULL
      )
      
      # Si el modelo se ajustó correctamente, almacenar los resultados
      if (!is.null(model)) {
        # Extraer el BIC del modelo
        bic <- BIC(model)
        
        # Almacenar la información en la lista de resultados
        results[[length(results) + 1]] <- list(
          predictors = paste(terms, collapse = " + "),
          model = model,
          BIC = bic
        )
      }
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = res$predictors,
        BIC = res$BIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por BIC de menor a mayor
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}

best_subset_multinom_interactions_parallel <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias dentro de la función
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  require(foreach)
  require(doParallel)
  require(progressr)
  
  # Iniciar los gestores de progreso
  handlers(global = TRUE)
  handlers("txt")
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar las fórmulas de los modelos
  formulas_list <- list()
  
  # Generar todas las fórmulas posibles con interacciones hasta de 3 variables
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- character(0)  # Aseguramos que es un vector de caracteres
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Generar todas las combinaciones posibles de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Identificar interacciones cuyos efectos principales están en 'me'
      if (length(interaction_terms) > 0) {
        possible_interactions <- interaction_terms[
          vapply(interaction_terms, function(x) {
            vars_in_interaction <- unlist(strsplit(x, ":"))
            all(vars_in_interaction %in% me)
          }, FUN.VALUE = logical(1))
        ]
      } else {
        possible_interactions <- character(0)
      }
      
      # Generar todas las combinaciones posibles de estas interacciones
      interaction_subsets <- list(character(0))  # Incluir el caso sin interacciones
      if (length(possible_interactions) > 0) {
        interaction_combinations <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
        interaction_subsets <- c(interaction_subsets, interaction_combinations)
      }
      
      # Para cada combinación de interacciones
      for (ints in interaction_subsets) {
        full_terms <- c(terms, ints)
        
        # Crear la fórmula del modelo y almacenarla
        formula_str <- paste(y, "~", paste(full_terms, collapse = "+"))
        formulas_list <- append(formulas_list, list(formula_str))
      }
    }
  }
  
  # Eliminar posibles duplicados de fórmulas
  formulas_list <- unique(formulas_list)
  
  # Total de modelos a ajustar
  total_models <- length(formulas_list)
  
  # Iniciar el progreso
  p <- progressor(steps = total_models)
  
  # Ajustar los modelos en paralelo usando foreach
  results_list <- foreach(i = 1:total_models, .packages = c("nnet", "MASS"), .combine = 'rbind') %dopar% {
    formula_str <- formulas_list[[i]]
    formula <- as.formula(formula_str)
    
    # Ajustar el modelo
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL,
      warning = function(w) NULL
    )
    
    # Actualizar el progreso
    p(sprintf("Ajustando modelo %d de %d", i, total_models))
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      bic <- BIC(model)
      data.frame(
        predictors = formula_str,
        BIC = bic,
        stringsAsFactors = FALSE
      )
    } else {
      NULL
    }
  }
  
  # Convertir los resultados a dataframe y ordenar por BIC
  results_df <- as.data.frame(results_list)
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}


num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)

#pacman job kableExtra tidyverse cluster WeightedCluster devtools TraMineR TraMineRextras NbClust haven ggseqplot gridExtra Tmisc factoextra reticulate withr rmarkdown quarto

options(knitr.kable.NA = '')


#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#

knitr::knit_hooks$set(time_it = local({
  now <- NULL
  function(before, options) {
    if (before) {
      # record the current time before each chunk
      now <<- Sys.time()
    } else {
      # calculate the time difference after a chunk
      res <- ifelse(difftime(Sys.time(), now)>(60^2),difftime(Sys.time(), now)/(60^2),difftime(Sys.time(), now)/(60^1))
      # return a character string to show the time
      x<-ifelse(difftime(Sys.time(), now)>(60^2),paste("Tiempo que demora esta sección:", round(res,1), "horas"),paste("Tiempo que demora esta sección:", round(res,1), "minutos"))
      paste('<div class="message">', gsub('##', '\n', x),'</div>', sep = '\n')
    }
  }
}))
knitr::opts_chunk$set(time_it = TRUE)

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:

format_cells <- function(df, rows ,cols, value = c("italics", "bold", "strikethrough")){
  
  # select the correct markup
  # one * for italics, two ** for bold
  map <- setNames(c("*", "**", "~~"), c("italics", "bold", "strikethrough"))
  markup <- map[value]  
  
  for (r in rows){
    for(c in cols){
      
      # Make sure values are not factors
      df[[c]] <- as.character( df[[c]])
      
      # Update formatting
      df[r, c] <- ifelse(nchar(df[r, c])==0,"",paste0(markup, gsub(" ", "", df[r, c]), markup))
    }
  }
  
  return(df)
}
#To produce line breaks in messages and warnings
knitr::knit_hooks$set(
  error = function(x, options) {
    paste('\n\n<div class="alert alert-danger">',
          gsub('##', '\n', gsub('^##\ Error', '**Error**', x)),
          '</div>', sep = '\n')
  },
  warning = function(x, options) {
    paste('\n\n<div class="alert alert-warning">',
          gsub('##', '\n', gsub('^##\ Warning:', '**Warning**', x)),
          '</div>', sep = '\n')
  },
  message = function(x, options) {
    paste('<div class="message">',
          gsub('##', '\n', x),
          '</div>', sep = '\n')
  }
)

#_#_#_#_#_#_#_#_#_#_#_#_#_
invisible("Function to format CreateTableOne into a database")

as.data.frame.TableOne <- function(x, ...) {capture.output(print(x,showAllLevels = TRUE, varLabels = T,...) -> x)
  y <- as.data.frame(x)
  y$characteristic <- dplyr::na_if(rownames(x), "")
  y <- y %>%
    fill(characteristic, .direction = "down") %>%
    dplyr::select(characteristic, everything())
  rownames(y) <- NULL
  y}
#_#_#_#_#_#_#_#_#_#_#_#_#_
# Austin, P. C. (2009). The Relative Ability of Different Propensity 
# Score Methods to Balance Measured Covariates Between 
# Treated and Untreated Subjects in Observational Studies. Medical 
# Decision Making. https://doi.org/10.1177/0272989X09341755
smd_bin <- function(x,y){
  z <- x*(1-x)
  t <- y*(1-y)
  k <- sum(z,t)
  l <- k/2
  
  return((x-y)/sqrt(l))
  
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:


if(.Platform$OS.type == "windows") withAutoprint({
  memory.size()
  memory.size(TRUE)
  memory.limit()
})
> memory.size()
[1] Inf
> memory.size(TRUE)
[1] Inf
> memory.limit()
[1] Inf
Código
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
func_tab_range_clus<-
function(range_clus){
rbind.data.frame(
  lapply(
    list(
      as.vector(rev(sort(table(range_clus$clustering$cluster2)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster3)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster4)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster5)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster6)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster7)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster8)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster9)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster10)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster11)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster12)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster13)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster14)))),
      as.vector(rev(sort(table(range_clus$clustering$cluster15))))
    ),
    function(x) {
      length_out <- max(sapply(list(
        as.vector(rev(sort(table(range_clus$clustering$cluster2)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster3)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster4)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster5)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster6)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster7)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster8)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster9)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster10)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster11)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster12)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster13)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster14)))),
        as.vector(rev(sort(table(range_clus$clustering$cluster15))))
      ), length))
      c(x, rep(NA, length_out - length(x)))
    }
  )
)%>%
  t() |> 
  data.frame()%>%
  `rownames<-`(NULL)
}


frobenius_norm <- function(matrix1, matrix2) {
    if (!all(dim(matrix1) == dim(matrix2))) {
        stop("Matrices must have the same dimensions")
    }
    
    # Replace NA values with 0 (or any other desired default)
    matrix1[is.na(matrix1)] <- 0
    matrix2[is.na(matrix2)] <- 0
    
    # Calculate the residuals
    residuals <- matrix1 - matrix2
    
    # Frobenius norm
    frobenius <- sqrt(sum(residuals^2))
    return(frobenius)
}



#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
confcqi2 <- function(nullstat, quant, n){
  alpha <- (1-quant)/2
  #calpha <- alpha+(alpha-1)/n
  #print(c(calpha, alpha))
  #minmax <- quantile(nullstat, c(calpha, 1-calpha))
  minmax <- quantile(nullstat, c(alpha, 1-alpha))
  return(minmax)
}

normstatcqi2 <- function(bcq, stat, norm=TRUE){
  origstat <- bcq$clustrange$stats[, stat]
  nullstat <- bcq$stats[[stat]]
  #normstat <- rbind(nullstat, origstat)
  if(norm){
    for(i in seq_along(origstat)){
      mx <- mean(nullstat[, i])
      sdx <- sd(nullstat[, i])
      nullstat[ , i] <- (nullstat[, i]-mx)/sdx
      origstat[i] <- (origstat[i]-mx)/sdx
    }
  }
  alldatamax <- apply(nullstat, 1, max)#as.vector(xx)
  sumcqi <- list(origstat=origstat, nullstat=nullstat, alldatamax=alldatamax)
  return(sumcqi)
}
print.seqnullcqi.powder <- function(x, norm = FALSE, quant = 0.95, digits = 2, 
                                    append = FALSE, ...) {
    cat("Parametric bootstrap cluster analysis validation\n")
    cat("Sequence analysis null model:", deparse(x$nullmodel), "\n")
    cat("Number of bootstraps:", x$R, "\n")
    cat("Clustering method:", ifelse(x$kmedoid, "PAM/K-Medoid", paste0("hclust with ", x$hclust.method)), "\n")
    cat("Seqdist arguments:", deparse(x$seqdist.args), "\n\n\n")
    alls <- as.data.frame(x$clustrange$stats)
    quants <- rep("", ncol(alls))
    names(quants) <- colnames(alls)
    for (ss in colnames(alls)) {
        sumcqi <- normstatcqi2(x, stat = ss, norm = norm)
        alls[, ss] <- as.character(round(sumcqi$origstat, digits = digits))
        borne <- as.character(round(confcqi2(sumcqi$alldatamax, quant, x$R), digits = digits))
        quants[ss] <- paste0("[", borne[1], "; ", borne[2], "]")
    }
    results_tibble <- tibble::as_tibble(rbind(alls, rep("", length(quants)), quants))
    # Print a summary to the console for immediate feedback
    rownames(results_tibble) <- c(rownames(x$clustrange$stats), "", paste("Null Max-T", quant, "interval"))
    
    results_df <- as.data.frame(results_tibble)
    print(results_tibble, ...)
    return(list(
      results_tibble= results_tibble, 
      results_df= results_df
      ))
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
##:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
# Función para aplicar la prueba de Fisher a todas las combinaciones de filas usando todas las columnas
fisher_posthoc_all_cols <- function(contingency_table) {
  # Obtener combinaciones de filas (pares)
  row_pairs <- combn(rownames(contingency_table), 2, simplify = FALSE)
  
  # Aplicar la prueba de Fisher a cada par de filas usando todas las columnas al mismo tiempo
  results <- map_dfr(row_pairs, function(pair) {
    # Crear tabla de 2xN para el par de filas en todas las columnas
    sub_table <- contingency_table[pair, , drop = FALSE]
    
    # Aplicar el test de Fisher
    test_result <- fisher.test(sub_table, 
                                 simulate.p.value=T,
                                 B=1e4)
    
    # Devolver los resultados en un data frame
    tibble(
      Row1 = pair[1],
      Row2 = pair[2],
      p.value = test_result$p.value
    )
  })
  
  # Ajustar p-valores usando el método de Holm
  results <- results %>%
    mutate(p.adjusted = p.adjust(p.value, method = "holm"))
  
  return(results)
}
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
save_base_plot_as_grob <- function(plot_expr, res=300,  width = 1600, height= 1200) {
    # Crea un archivo temporal con extensión .png
    filename <- tempfile(fileext = ".png")
    
    # Guarda el gráfico en alta resolución en el archivo temporal
    png(filename, width = width, height = height, res = res)
    replayPlot(plot_expr)  # Reproduce el gráfico grabado
    dev.off()  # Cierra el dispositivo gráfico
    
    # Convierte el archivo PNG en un objeto gráfico (grob)
    grob <- grid::rasterGrob(png::readPNG(filename), interpolate = TRUE)
    
    return(grob)  # Devuelve el grob
}
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
chisq_cramerv<- function(contingency_table){
  chisq_test <- chisq.test(contingency_table)
  cramers_v <- sqrt(chisq_test$statistic / (sum(contingency_table) * (min(dim(contingency_table)) - 1)))
  
  list(chisq_statistic= sprintf("%1.2f", chisq_test$statistic), chisq_df= chisq_test$parameter, chisq_p_value = ifelse(chisq_test$p.value<.001, "<0.001", sprintf("%1.4f", chisq_test$p.value)), cramers_v = sprintf("%1.2f", cramers_v))
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#
oneway_anova_effect_size <- function(values, group) {
  # Perform one-way ANOVA
  anova_result <- aov(values ~ group)
  
  # Summarize ANOVA results
  anova_summary <- summary(anova_result)
  
  # Extract sums of squares
  ss_between <- anova_summary[[1]]$"Sum Sq"[1]
  ss_total <- sum(anova_summary[[1]]$"Sum Sq")
  
  # Calculate eta-squared
  eta_squared <- ss_between / ss_total
  
  # Return ANOVA summary and effect size
  list(
    anova_summary = anova_summary,
    eta_squared = eta_squared
  )
}

Resultados

1. Trimestral

1.2. Sensibilidad= PAM (OM), sol 7 cluster- diagnósticos

Código
invisible("Información sobre la solución")
invisible("H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/_hist_sintaxis/un_inv_ii5_explorar_soluciones.R")
# 
invisible("Hacemos clasificación de pertenencia cluster y ponemos etiquetas")
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7 <-
  factor(pamRange_quarter_om$clustering$cluster7,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster7)), "name")),
         labels= c("6035, Un trimestre, TSM(6)", 
                   "6025, Un trimestre, TUS(5)", 
                   "5939, Un semestre TSM(3)", 
                   "5989, Comorbilidad un trimestre(4)", 
                   "6036, TSM, 1 año después, otras causas(7)", 
                   "5710, TSM, 1 año después, TSM(1)",
                   "5935, TSM, 6 meses después, TSM(2)"
         ))

invisible("Me da buena: 0,61 en promedio. Se mantiene. El problema está con 5710 es negativo")
sil_pam_om_clus7_q_nostd<-
  silhouette(as.integer(pamRange_quarter_om$clustering$cluster7), as.dist(dist_quarter_om))

# Crear etiquetas personalizadas
cluster_labels7 <- paste0("Cluster ", 
          seq_along(attr(summary(sil_pam_om_clus7_q_nostd)$clus.avg.widths, "dimnames")[[1]]), 
          ":\nAWS ", sprintf("%1.2f",summary(sil_pam_om_clus7_q_nostd)$clus.avg.widths))

# Graficar con etiquetas personalizadas
fviz_silhouette(
  sil_pam_om_clus7_q_nostd, 
  lab.clusters = cluster_labels7, # Etiquetas personalizadas para los clústeres
  print.summary=F) +
  scale_fill_grey(start = 0.2, end = 0.8, labels = cluster_labels7) +  # Escala de grises
  scale_color_grey(start = 0.2, end = 0.8, labels = cluster_labels7)+   # Escala de grises para los bordea
  ggtitle(NULL)+
  labs(y="Ancho medio de la silueta", x="Conglomerados")# Elimina el título

Código
ggsave("_figs/sil_plot_pam_om7_q.png", width = 8, height = 5, dpi = 500)

Tiempo que demora esta sección: 0.4 minutos

De la figura se desprende que el conglomerado 5710, Un año despues, TSM tiene un ajuste promedio negativo. En menor medida, el conglomerado 6036, TSM, 1 año después, otras causas, tiene algunos valores de ancho de silueta negativos. Posteriormente vemos una tabla de contingencia para entender el origen de los nuevos conglomerados.

Código
# Crear la tabla de frecuencias proporcionales redondeada
tabla_proporciones <- round(prop.table(table(pamRange_quarter_om$clustering$cluster7, 
                                             pamRange_quarter_om$clustering$cluster4), 2), 2)

# Convertir la tabla a un formato limpio con kable
knitr::kable(tabla_proporciones, 
             caption = "Proporciones de Clusters, Solución de 7 vs. 4 conglomerados", 
             col.names = c("5939, Un semestre TSM(1)", "5989, Comorbilidad un trimestre(2)", 
                           "6025, Un trimestre, TUS(3)", "6035, Un trimestre, TSM(4)"), 
             align = "c")
Proporciones de Clusters, Solución de 7 vs. 4 conglomerados
5939, Un semestre TSM(1) 5989, Comorbilidad un trimestre(2) 6025, Un trimestre, TUS(3) 6035, Un trimestre, TSM(4)
5710 0.09 0.02 0.01 0.02
5935 0.02 0.01 0.00 0.03
5939 0.88 0.00 0.00 0.00
5989 0.00 0.97 0.00 0.00
6025 0.00 0.00 0.99 0.00
6035 0.00 0.00 0.00 0.91
6036 0.00 0.00 0.00 0.04

Tiempo que demora esta sección: 0 minutos

Una comparación con las agrupaciones de la solución de 4 conglomerados identifica que el conglomerado 6035, Un trimestre, TSM(4) conserva el 91% de sus observaciones originales. yendo un 4% a representar el 100% de las observaciones del conglomerado 6036: TSM, 1 año después, otras causas(7), el 3% se desprende al conglomerado 5935: TSM, 6 meses después, TSM(2) y el 2% restante se incorpora al conglomerado 5710, que está compuesto en un 70% por este mismo grupo. Por otra parte, el conglomerado 5939: Un semestre, TSM(3) conserva el 88% de sus observaciones originales. Del porcentaje restante, un 9% se transfiere al conglomerado 5710, donde representa el 23% de este último, y un 2% se dirige al conglomerado 5935, representando el 6% de dicho grupo.

Vemos los diagnósticos que vienen después de aquellos cluster con más de un ingreso.

Código
# "6036, TSM, 1 año después, otras causas(7)", 
# "5710, TSM, 1 año después, TSM(1)",
# "5935, TSM, 6 meses después, TSM(2)"

diag_pam_om7_q_6036<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam_om7=="6036, TSM, 1 año después, otras causas(7)")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
invisible("head(arrange(data.frame(table(diag_pam_om7_q_6036)) |> mutate(across(1, as.character)), -Freq),10) |> dput()")
invisible("Para chatgpt= estos son códigos de CIE-10, descríbeme brevemente cada uno en markdown en formato 'Cód. CIE-10 (n=Freq) - [descripción] '")

Tiempo que demora esta sección: 0 minutos

Entre quienes se encontraron ingresados en el sistemas por TSM, y luego de un año son ingresados por otras causas, esas causas posteriores abarcan principalmente:

  • O800 (n=17) - Parto único espontáneo
  • F192 (n=16) - Dependencia de múltiples sustancias y otros trastornos relacionados
  • E101 (n=15) - Diabetes mellitus insulinodependiente con cetoacidosis
  • Z370 (n=14) - Nacimiento de un solo bebé nacido vivo
  • Z518 (n=13) - Atención médica específica, no especificada
  • N390 (n=12) - Infección del tracto urinario, sitio no especificado
  • F322 (n=11) - Episodio depresivo grave sin síntomas psicóticos
  • F609 (n=11) - Trastorno de la personalidad no especificado
  • G409 (n=9) - Epilepsia no especificada
  • F603 (n=8) - Trastorno de la personalidad emocionalmente inestable
Código
# "5935, TSM, 6 meses después, TSM(1)"

diag_pam_om7_q_5710<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam_om7=="5710, TSM, 1 año después, TSM(1)")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
invisible("head(arrange(data.frame(table(diag_pam_om7_q_5710)) |> mutate(across(1, as.character)), -Freq),10) |> dput()")
invisible("Para chatgpt= estos son códigos de CIE-10, descríbeme brevemente cada uno en markdown en formato 'Cód. CIE-10 (n=Freq) - [descripción] '")

Tiempo que demora esta sección: 0 minutos

Entre las trayectorias que ingresaron por trastornos de salud mental, y posteriormente reingreesaron por las mismas causas un año después (5710), estas son las principales causas por las que reingresan posteriormente:

  • F603 (n=65) - Trastorno de la personalidad emocionalmente inestable
  • F329 (n=50) - Episodio depresivo no especificado
  • F609 (n=50) - Trastorno de la personalidad no especificado
  • F322 (n=43) - Episodio depresivo grave sin síntomas psicóticos
  • F209 (n=42) - Esquizofrenia no especificada
  • F319 (n=39) - Trastorno afectivo no especificado
  • F200 (n=38) - Esquizofrenia paranoide
  • F192 (n=31) - Dependencia de múltiples sustancias y otros trastornos relacionados
  • C490 (n=29) - Neoplasia maligna del tejido blando, sitio no especificado
  • G909 (n=21) - Trastorno del sistema nervioso, no especificado
Código
diag_pam_om7_q_5935<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam_om7=="5935, TSM, 6 meses después, TSM(2)")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
invisible("head(arrange(data.frame(table(diag_pam_om7_q_5710)) |> mutate(across(1, as.character)), -Freq),10) |> dput()")
invisible("Para chatgpt= estos son códigos de CIE-10, descríbeme brevemente cada uno en markdown en formato 'Cód. CIE-10 (n=Freq) - [descripción] '")

Tiempo que demora esta sección: 0 minutos

Entre quienes experimentaron una trayectoria conssitente en ingresar por trastornos de salud mental, y luego de 6 meses reingresar por las mismas causas, (5935), se encuentran los siguientes diagnósticos al reingreso:

  • F603 (n=65) - Trastorno de la personalidad emocionalmente inestable
  • F329 (n=50) - Episodio depresivo no especificado
  • F609 (n=50) - Trastorno de la personalidad no especificado
  • F322 (n=43) - Episodio depresivo grave sin síntomas psicóticos
  • F209 (n=42) - Esquizofrenia no especificada
  • F319 (n=39) - Trastorno afectivo no especificado
  • F200 (n=38) - Esquizofrenia paranoide
  • F192 (n=31) - Dependencia de múltiples sustancias y otros trastornos relacionados
  • C490 (n=29) - Neoplasia maligna del tejido blando, sitio no especificado
  • G909 (n=21) - Trastorno del sistema nervioso, no especificado

Luego vemos la clasificación de PPOO por cluster

Código
janitor::chisq.test(df_filled[,c("run","glosa_pueblo_originario")] %>% 
        dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam_om7")], by="run", multiple="first") %>% 
        janitor::tabyl(glosa_pueblo_originario, clus_pam_om7))

    Pearson's Chi-squared test

data:  df_filled[, c("run", "glosa_pueblo_originario")] %>% dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,     c("run", "clus_pam_om7")], by = "run", multiple = "first") %>%     janitor::tabyl(glosa_pueblo_originario, clus_pam_om7)
X-squared = 199.16, df = 48, p-value < 2.2e-16
Código
# X-squared = 136.81, df = 24, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

Generamos un gráfico de PPOO por cada conglomerado.

Código
ppoo_clus_pre_pam_om7_q<-
  df_filled[,c("run","glosa_pueblo_originario")] %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam_om7","factor_inclusivo_real_hist_mas_autperc")], by="run", multiple="first") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= dplyr::case_when(glosa_pueblo_originario=="NINGUNO" & factor_inclusivo_real_hist_mas_autperc!="00"~ "DESCONOCIDO", T~glosa_pueblo_originario)) %>% 
  janitor::tabyl(glosa_pueblo_originario_rec, clus_pam_om7) %>% 
  janitor::adorn_percentages("row")
#scale_fill_manual(values = rev(c("#D2B48C", "#E27A5B", "#708090", "#6B8E23", "#506070"  , "#2F4F4F", "#20B2AA"))) +
reshape2::melt(ppoo_clus_pre_pam_om7_q, id.vars = "glosa_pueblo_originario_rec") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= 
    dplyr::recode(glosa_pueblo_originario_rec, 
      "OTRO (ESPECIFICAR)"="OTRO(n=77)", 
      "RAPA NUI (PASCUENSE)"="RAPA NUI(n=34)", 
      "YAGÁN (YÁMANA)"="YAGÁN(n=2)",
      "AYMARA"="AYMARA(n=13)",
      "COLLA"="COLLA(n=6)",
      "DIAGUITA"="DIAGUITA(n=3)",
      "KAWÉSQAR"="KAWÉSQAR(n=4)",
      "MAPUCHE"="MAPUCHE(n=255)",
      "DESCONOCIDO"=".DESCONOCIDO(n=1.985)",
      "NINGUNO"=".NINGUNO(n=9.156)")) %>% 
ggplot(aes(x = glosa_pueblo_originario_rec, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "fill") + 
  scale_fill_manual(values =  c(
  "6035, Un trimestre, TSM(6)" = "#D2B48C",
  "6025, Un trimestre, TUS(5)" = "#E27A5B",
  "Un semestre TSM(3)" = "#708090",
  "5989, Comorbilidad un trimestre(4)" = "#6B8E23",
  "6036, TSM, 1 año después, otras causas(7)" = "#506070",
  "5710, TSM, 1 año después, TSM(1)" = "#2F4F4F",
  "5935, TSM, 6 meses después, TSM(2)" = "#20B2AA"
)) +
  labs(title = NULL,
       x = "Grupo Étnico",
       y = "Proporción de Casos",
       fill = "Grupos") +  # Cambia el título de la leyenda a "Grupos"
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 12),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 12),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 14),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 14),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 14, margin = margin(b = -.1)),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 12)            # Tamaño del texto de la leyenda
    ) + 
  coord_flip()  # Hacer el gráfico horizontal
ggsave("_figs/grafico_ancho_achatado_pam_om7_q.png", width = 10, height = 5, dpi=1000)
PPOO por cluster

PPOO por cluster

Tiempo que demora esta sección: 0.1 minutos

Vemos que en los ingresados Rapa Nui, hay una importante proporción de participantes (50%) son clasificados en el conglomerado “5710, TSM, 1 año después, TSM”.

1.2.1. Trayectorias

Vemos los gráficos de las trayectorias

Código
categories_pam_om7_q<-attr(States_Wide.seq_quarter_t_prim_adm_cens, "labels")
new_labels <- categories_pam_om7_q
new_labels[which(categories_pam_om7_q == "Otras causas")] <- "Otras\ncausas"
#new_labels[which(categories == "Consumo\nde sustancias")] <- "Consumo de\nsustancias"

# Creamos un vector con las columnas llenando con NA si faltan valores
sil_pam_om_clus7_q <- wcSilhouetteObs(as.dist(dist_quarter_om), 
        pamRange_quarter_om$clustering$cluster7, measure="ASW")


seq_plot_pam_om7_q <- ggseqiplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                                 group= ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7,
                                 facet_ncol=2, facet_nrow=4, sortv=sil_pam_om_clus7_q) +
  theme(legend.position = "none")+
  labs(x="Trimestres", y="# IDs de usuarios")+
  #guides(fill = guide_legend(nrow = 1))+
  theme(
    panel.spacing = unit(0.1, "lines"),  # Reduce el espaciado entre los paneles
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -10)),#,margin = margin(l = -10)),
    strip.text = element_text(size = 15, margin = margin(b =-15, t=10)),
    legend.text = element_text(size = 15),
    legend.spacing.x = unit(0.1, 'cm'),  # Alinea el título de la leyenda hacia la izquierda
    legend.box.margin = margin(t = 0, r = 0, b = 0, l = -50),
    legend.position = "bottom", 
    legend.justification = "left",
    panel.spacing.y = unit(0.2, "lines"),
    plot.margin = margin(10, 10, 10, 10), # Ajusta márgenes globales
    strip.placement = "outside",   # Para colocar las tiras fuera de los ejes
    strip.background = element_blank() # Elimina el fondo para que parezca más espacioso
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda
  )+
  guides(fill = guide_legend(nrow = 1)) +
  scale_fill_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                  "#FFFFFF","#808080","#000000"))+
  scale_color_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                   "#FFFFFF","#808080","#000000"))
seq_plot_pam_om7_q 

ggsave(filename="_figs/clusters_pam_om7_q_mod.png", seq_plot_pam_om7_q,  width = 12*.95, height = 8*.95, dpi=1000)
Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico (observaciones ordenadas de acuerdo a ASW)

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico (observaciones ordenadas de acuerdo a ASW)

Tiempo que demora esta sección: 0.3 minutos

Código
seq_plot2_pam_om7_q <- ggseqdplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                                 group= ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7,
                                 facet_ncol=2, facet_nrow=4) +
  theme(legend.position = "none")+  # Colocar la leyenda abajo
  labs(x="Trimestres", y="Frecuencia relativa de estados")+
  theme(
    panel.spacing = unit(0.1, "lines"),
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -5)),
    strip.text = element_text(size = 15),
    panel.spacing.y = unit(0.5, "lines"),
    strip.placement = "outside",   # Para colocar las tiras fuera de los ejes
    strip.background = element_blank() # Elimina el fondo para que parezca más espacioso
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda    
  )  # Colocar la leyenda abajo
seq_plot2_pam_om7_q
ggsave("_figs/clusterspam_om72_q_mod.png",seq_plot2_pam_om7_q, width = 12, height = 8, dpi=1000)


table_data_pam_om7_q <- sprintf("%1.2f",pamRange_quarter_om$stats[3,])
table_data_pam_om7_q <-as.data.frame(t(table_data_pam_om7_q))
colnames(table_data_pam_om7_q)<-attr(pamRange_quarter_om$stats, "name")
table_data_pam_om7_q %>% knitr::kable()
PBC HG HGSD ASW ASWw CH R2 CHsq R2sq HC
0.50 0.67 0.67 0.60 0.60 922.92 0.31 1269.60 0.39 0.18

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Tiempo que demora esta sección: 0.2 minutos

De este modo, presenta el cambio agregado en la distribución de estados a lo largo del tiempo, sin considerar las secuencias individuales.

Código
invisible("Definimos las observaciones que tienen siluetas negativas")
sil_neg_pam_om_clus7_q <- which(sil_pam_om_clus7_q<0)

invisible("A qué conglomerados pertenecen?")
table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[sil_neg_pam_om_clus7_q, "clus_pam_om7"])

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$rn<- 1:nrow(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens)
clus_pam_om7
               6035, Un trimestre, TSM(6) 
                                        0 
               6025, Un trimestre, TUS(5) 
                                        0 
                 5939, Un semestre TSM(3) 
                                        0 
       5989, Comorbilidad un trimestre(4) 
                                        0 
6036, TSM, 1 año después, otras causas(7) 
                                       23 
         5710, TSM, 1 año después, TSM(1) 
                                       86 
       5935, TSM, 6 meses después, TSM(2) 
                                        3 

Tiempo que demora esta sección: 0 minutos

1.2.2.Exploración transiciones

1.2.2.a Transiciones- RM y no RM

Tasas de transición no RM a RM y viceversa

Código
invisible("Tasas de transición no RM a RM y viceversa")

trim_tasa_pam_om7_q_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa_pam_om7_q_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Código
trim_tasa_pam_om7_q_cens_rate %>%   
  dplyr::left_join(trim_tasa_pam_om7_q_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  dplyr::filter(from %in% c("RM", "noRM")) %>%  
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")

invisible("Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)

1.2.2.b Transiciones
Código
trim_tasa2_pam_om7_q_cens_cnt<-  
   seqcount_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa2_pam_om7_q_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Código
trim_tasa2_pam_om7_q_cens_rate %>%   
  dplyr::left_join(trim_tasa2_pam_om7_q_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  #dplyr::filter(from %in% c("RM", "noRM")) %>%  
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")
Porcentajes de transición, transiciones posteriores, por cada cluster

Porcentajes de transición, transiciones posteriores, por cada cluster

Tiempo que demora esta sección: 0.1 minutos

1.2.2.c Tiempo promedio por cluster
Código
seq_mean_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7) %>% 
  data.table::as.data.table(keep.rowname=T) %>%
  dplyr::mutate(rn= gsub("\\d", "", rn)) |> 
  ggplot(aes(x=rn, fill= factor_inclusivo, y=Mean))+
  geom_bar(width = 1, stat = "identity") +
  theme_minimal() +
  facet_wrap(~factor_inclusivo)+
  labs(title = NULL,
       x = NULL,
       y = NULL) +
  scale_fill_manual(values = rev(c("#D2B48C", "#E27A5B", "#708090", "#6B8E23", "#506070"  , "#2F4F4F", "#20B2AA"))) +
  coord_flip()+
  theme(#axis.text.x = element_blank(),
    #axis.text.y = element_blank(),
    panel.grid = element_blank()) +
#  scale_fill_brewer(palette = "Pastel1", labels=c("Sin\nautoidentificación\nni reconocimiento", "Autoidentificación\nsin reconocimiento", "Ambas")) +
  geom_text(aes(label = round(Mean,1)), 
            position = position_stack(vjust = 0.5), 
            size = 3.5, # Ajusta el tamaño de la fuente aquí
            color = "black", # Color del texto
            family = "sans", # Puedes cambiar la fuente si lo deseas
            background = element_rect(fill = "white", color = NA)) + # Fondo blanco
  theme(legend.title = element_blank(), legend.position=c(.8,.15))

invisible("No me aporta mucho")
Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo que demora esta sección: 0.1 minutos

Observamos que aquellos en el conglomerado que se encuentra ingresada por trastornos de salud mental y luego vuelve, la duración de los ingresos relacionados con trastornos de salud mental son en promedio casi dos veces más largos.

1.2.3. Comparación variables

1.2.3.a. Comparación covariables- PPOO
Código
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::count(clus_pam_om7, factor_inclusivo_real_hist_mas_autperc) %>%
  dplyr::group_by(clus_pam_om7) %>%
  dplyr::mutate(n_prop = paste0(n, " (",scales::percent(n / sum(n), accuracy=.1),")")) %>%
  dplyr::select(-n) %>%
  tidyr::pivot_wider(names_from = factor_inclusivo_real_hist_mas_autperc, values_from = n_prop, values_fill = "0")%>% 
  knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "No se identifica/hay reconocimiento", "Se identifica/hay reconocimeinto"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO")

invisible("6025 tiwnw un poxo mas PPOO, lo mismo con 5710")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO
Conglomerados No se identifica/no pertenece No se identifica/hay reconocimiento Se identifica/hay reconocimeinto
6035, Un trimestre, TSM(6) 3528 (80.7%) 487 (11.1%) 357 (8.2%)
6025, Un trimestre, TUS(5) 534 (78.5%) 79 (11.6%) 67 (9.9%)
5939, Un semestre TSM(3) 258 (82.4%) 34 (10.9%) 21 (6.7%)
5989, Comorbilidad un trimestre(4) 173 (84.4%) 18 (8.8%) 14 (6.8%)
6036, TSM, 1 año después, otras causas(7) 150 (79.4%) 23 (12.2%) 16 (8.5%)
5710, TSM, 1 año después, TSM(1) 116 (81.7%) 15 (10.6%) 11 (7.7%)
5935, TSM, 6 meses después, TSM(2) 104 (75.9%) 16 (11.7%) 17 (12.4%)

Tiempo que demora esta sección: 0 minutos

Vemos las categorías de clasificación de PPOO según autopercepción (en MINSAL y en RSH) y reconocimiento CONADI.

Código
chisq.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7))
#X-squared = 5.5844, df = 6, p-value = 0.4713

chisq_cramerv(
table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7)
)

cat("Descartando valores negativos en sil width")
chisq.test(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(factor_inclusivo_real_hist_mas_autperc, clus_pam_om7))
)


chisq_cramerv(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(factor_inclusivo_real_hist_mas_autperc, clus_pam_om7))
)

    Pearson's Chi-squared test

data:  table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc,     ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7)
X-squared = 9.1086, df = 12, p-value = 0.6936

$chisq_statistic
[1] "9.11"

$chisq_df
df 
12 

$chisq_p_value
[1] "0.6936"

$cramers_v
[1] "0.03"

Descartando valores negativos en sil width
    Pearson's Chi-squared test

data:  with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens,     !rn %in% sil_neg_pam_om_clus7_q), table(factor_inclusivo_real_hist_mas_autperc,     clus_pam_om7))
X-squared = 11.067, df = 12, p-value = 0.5232

$chisq_statistic
[1] "11.07"

$chisq_df
df 
12 

$chisq_p_value
[1] "0.5232"

$cramers_v
[1] "0.03"

Tiempo que demora esta sección: 0 minutos

No se constata una asocaición entre autoidentificación/reconocimiento perteneciente a PPOO y la pertenencia a conglomerados.

Ahora lo hacemos con la versión binarizada

Código
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::count(clus_pam_om7, factor_inclusivo_real_hist_mas_autperc_bin) %>%
    dplyr::group_by(clus_pam_om7) %>%
    dplyr::mutate(n_prop = paste0(n, " (",scales::percent(n / sum(n), accuracy=0.1),")")) %>%
    dplyr::select(-n) %>%
    tidyr::pivot_wider(names_from = factor_inclusivo_real_hist_mas_autperc_bin, values_from = n_prop, values_fill = "0")  %>%  #rio::export("clipboard")
  knitr::kable("markdown", caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO / Binario")


ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin<- ifelse(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc=="00",0,1)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc_bin,clus_pam_om7) %>%
    janitor::chisq.test()
#X-squared = 4.0105, df = 3, p-value = 0.2603

chisq_cramerv(
with(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, table(factor_inclusivo_real_hist_mas_autperc_bin, clus_pam_om7))
)
#
cat("Descartando valores negativos en sil width")
chisq.test(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(factor_inclusivo_real_hist_mas_autperc_bin , clus_pam_om7))
)

chisq_cramerv(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(factor_inclusivo_real_hist_mas_autperc_bin, clus_pam_om7))
)
Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO / Binario
clus_pam_om7 0 1
6035, Un trimestre, TSM(6) 3528 (80.7%) 844 (19.3%)
6025, Un trimestre, TUS(5) 534 (78.5%) 146 (21.5%)
5939, Un semestre TSM(3) 258 (82.4%) 55 (17.6%)
5989, Comorbilidad un trimestre(4) 173 (84.4%) 32 (15.6%)
6036, TSM, 1 año después, otras causas(7) 150 (79.4%) 39 (20.6%)
5710, TSM, 1 año después, TSM(1) 116 (81.7%) 26 (18.3%)
5935, TSM, 6 meses después, TSM(2) 104 (75.9%) 33 (24.1%)

    Pearson's Chi-squared test

data:  .
X-squared = 6.6303, df = 6, p-value = 0.3564

$chisq_statistic
[1] "6.63"

$chisq_df
df 
 6 

$chisq_p_value
[1] "0.3564"

$cramers_v
[1] "0.03"

Descartando valores negativos en sil width
    Pearson's Chi-squared test

data:  with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens,     !rn %in% sil_neg_pam_om_clus7_q), table(factor_inclusivo_real_hist_mas_autperc_bin,     clus_pam_om7))
X-squared = 7.2764, df = 6, p-value = 0.296

$chisq_statistic
[1] "7.28"

$chisq_df
df 
 6 

$chisq_p_value
[1] "0.2960"

$cramers_v
[1] "0.04"

Tiempo que demora esta sección: 0 minutos

Código
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc_bin,clus_pam_om7)%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate(across(-factor_inclusivo_real_hist_mas_autperc_bin, ~sprintf("%d (%.1f%%)", janitor::tabyl(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens,factor_inclusivo_real_hist_mas_autperc_bin,clus_pam_om7)[[cur_column()]],.*100)))|>
  #dplyr::mutate_at(2:ncol(.), ~scales::percent(as.numeric(.), accuracy=.1)) %>% 
  knitr::kable(caption="Tabla de contingencia, PPOO (proporción por columna)")
Tabla de contingencia, PPOO (proporción por columna)
factor_inclusivo_real_hist_mas_autperc_bin 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
0 3528 (80.7%) 534 (78.5%) 258 (82.4%) 173 (84.4%) 150 (79.4%) 116 (81.7%) 104 (75.9%)
1 844 (19.3%) 146 (21.5%) 55 (17.6%) 32 (15.6%) 39 (20.6%) 26 (18.3%) 33 (24.1%)

Tiempo que demora esta sección: 0 minutos

Tampoco se observa asociación alguna. Hicimos una prueba post-hoc usando Bonferroni

1.2.3.b. Comparación covariables- Mortalidad
Código
# 
invisible("No hay nada, el tiempo promedio de censura es similar")

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
  janitor::tabyl(clus_pam_om7,death_time_rec) %>% 
  dplyr::mutate(`1`= paste0(`1`," (", scales::percent(`1`/(`0`+`1`), accuracy=.1),")")) %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_pam_om7) %>% 
  dplyr::summarise(mean=sprintf("%1.1f",mean(cens_time))), by="clus_pam_om7") %>% 
  dplyr::select(-`0`) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado","Mortalidad observada", "Promedio"), caption="Post-hoc, conglomerado vs. Mortalidad y tiempo a censura")
Post-hoc, conglomerado vs. Mortalidad y tiempo a censura
Conglomerado Mortalidad observada Promedio
6035, Un trimestre, TSM(6) 40 (0.9%) 17.9
6025, Un trimestre, TUS(5) 13 (1.9%) 18.2
5939, Un semestre TSM(3) 7 (2.2%) 18.0
5989, Comorbilidad un trimestre(4) 4 (2.0%) 18.1
6036, TSM, 1 año después, otras causas(7) 2 (1.1%) 17.8
5710, TSM, 1 año después, TSM(1) 3 (2.1%) 18.1
5935, TSM, 6 meses después, TSM(2) 1 (0.7%) 17.9

Tiempo que demora esta sección: 0 minutos

Código
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam_om7) %>% 
              janitor::chisq.test(correct=T)
#X-squared = 11.293, df = 6, p-value = 0.07972

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam_om7) %>% 
              janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 0.04477

chisq_cramerv(
with(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)), table(death_time_rec , clus_pam_om7))
)


cat("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q)%>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)), table(death_time_rec , clus_pam_om7))
)


subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q) %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam_om7) %>% 
              janitor::fisher.test(simulate.p.value=T, B=1e5)
#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
##_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
tab_cl_mortalidad_pam_om7_q<- 
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) |> 
  janitor::tabyl(death_time_rec,clus_pam_om7) |> 
  as.matrix(ncol=2)

labels_pam_om7_q <- c(
  "6035, Un trimestre, TSM(6)",
  "6025, Un trimestre, TUS(5)",
  "Un semestre TSM(3)",
  "5989, Comorbilidad un trimestre(4)",
  "6036, TSM, 1 año después, otras causas(7)",
  "5710, TSM, 1 año después, TSM(1)",
  "5935, TSM, 6 meses después, TSM(2)"
)
# Realizar el análisis y crear la tabla directamente
pairwise.prop.test(t(tab_cl_mortalidad_pam_om7_q[,2:ncol(tab_cl_mortalidad_pam_om7_q)]), p.adjust.method = "holm")$p.value |>
  as.table() |>
  as.data.frame() |>
  rename(Grupo_1 = Var1, Grupo_2 = Var2, p_value = Freq) |>
  filter(!is.na(p_value)) |>
  mutate(
    Grupo_1 = labels_pam_om7_q[as.numeric(Grupo_1)],
    Grupo_2 = labels_pam_om7_q[as.numeric(Grupo_2)],
    p_value = ifelse(p_value <.001, "<.001", sprintf("%1.3f",p_value)) 
  ) |>
  kable(
    col.names = c("Grupo 1", "Grupo 2", "Valor p ajustado"),
    align = "l",
    caption= "Corrección parcial por comparaciones múltiples (Holm–Bonferroni)"
  )

    Pearson's Chi-squared test

data:  .
X-squared = 11.293, df = 6, p-value = 0.07972


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.04379
alternative hypothesis: two.sided

$chisq_statistic
[1] "11.29"

$chisq_df
df 
 6 

$chisq_p_value
[1] "0.0797"

$cramers_v
[1] "0.04"

Descartando valores negativos en sil width$chisq_statistic
[1] "10.42"

$chisq_df
df 
 6 

$chisq_p_value
[1] "0.1080"

$cramers_v
[1] "0.04"


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.05476
alternative hypothesis: two.sided
Corrección parcial por comparaciones múltiples (Holm–Bonferroni)
Grupo 1 Grupo 2 Valor p ajustado
6035, Un trimestre, TSM(6) 6035, Un trimestre, TSM(6) 0.628
6025, Un trimestre, TUS(5) 6035, Un trimestre, TSM(6) 0.970
Un semestre TSM(3) 6035, Un trimestre, TSM(6) 1.000
5989, Comorbilidad un trimestre(4) 6035, Un trimestre, TSM(6) 1.000
6036, TSM, 1 año después, otras causas(7) 6035, Un trimestre, TSM(6) 1.000
5710, TSM, 1 año después, TSM(1) 6035, Un trimestre, TSM(6) 1.000
6025, Un trimestre, TUS(5) 6025, Un trimestre, TUS(5) 1.000
Un semestre TSM(3) 6025, Un trimestre, TUS(5) 1.000
5989, Comorbilidad un trimestre(4) 6025, Un trimestre, TUS(5) 1.000
6036, TSM, 1 año después, otras causas(7) 6025, Un trimestre, TUS(5) 1.000
5710, TSM, 1 año después, TSM(1) 6025, Un trimestre, TUS(5) 1.000
Un semestre TSM(3) Un semestre TSM(3) 1.000
5989, Comorbilidad un trimestre(4) Un semestre TSM(3) 1.000
6036, TSM, 1 año después, otras causas(7) Un semestre TSM(3) 1.000
5710, TSM, 1 año después, TSM(1) Un semestre TSM(3) 1.000
5989, Comorbilidad un trimestre(4) 5989, Comorbilidad un trimestre(4) 1.000
6036, TSM, 1 año después, otras causas(7) 5989, Comorbilidad un trimestre(4) 1.000
5710, TSM, 1 año después, TSM(1) 5989, Comorbilidad un trimestre(4) 1.000
6036, TSM, 1 año después, otras causas(7) 6036, TSM, 1 año después, otras causas(7) 1.000
5710, TSM, 1 año después, TSM(1) 6036, TSM, 1 año después, otras causas(7) 1.000
5710, TSM, 1 año después, TSM(1) 5710, TSM, 1 año después, TSM(1) 1.000

Tiempo que demora esta sección: 0 minutos

No se constata una asociación entre la pertenencia a un conglomerado y mortalidad.

Código
# Cargar las librerías necesarias
library(survival)

Adjuntando el paquete: ‘survival’

The following object is masked from ‘package:survminer’:

myeloma
Código
library(ggplot2)

# Crear la variable de supervivencia
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$surv_obj_7c <- Surv(time = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$death_time,
                 event = ifelse(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$death_time==20,0,1))

# Realizar el análisis de Log-Rank (survdiff)
surv_diff_7c <- survdiff(surv_obj_7c ~ clus_pam_om7,
                      data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens)

# Mostrar los resultados del test
print(surv_diff_7c)
Call:
survdiff(formula = surv_obj_7c ~ clus_pam_om7, data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens)

                                                          N Observed Expected
clus_pam_om7=6035, Un trimestre, TSM(6)                4372       40    50.72
clus_pam_om7=6025, Un trimestre, TUS(5)                 680       13     7.86
clus_pam_om7=5939, Un semestre TSM(3)                   313        7     3.62
clus_pam_om7=5989, Comorbilidad un trimestre(4)         205        4     2.36
clus_pam_om7=6036, TSM, 1 año después, otras causas(7)  189        2     2.19
clus_pam_om7=5710, TSM, 1 año después, TSM(1)           142        3     1.64
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)         137        1     1.59
                                                       (O-E)^2/E (O-E)^2/V
clus_pam_om7=6035, Un trimestre, TSM(6)                   2.2656    8.2256
clus_pam_om7=6025, Un trimestre, TUS(5)                   3.3527    3.7771
clus_pam_om7=5939, Un semestre TSM(3)                     3.1427    3.3144
clus_pam_om7=5989, Comorbilidad un trimestre(4)           1.1327    1.1723
clus_pam_om7=6036, TSM, 1 año después, otras causas(7)    0.0169    0.0175
clus_pam_om7=5710, TSM, 1 año después, TSM(1)             1.1188    1.1457
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)           0.2192    0.2243

 Chisq= 11.2  on 6 degrees of freedom, p= 0.08 
Código
pairwise_survdiff(
    formula = surv_obj_7c ~ clus_pam_om7,
    data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens,
    p.adjust.method = "holm"
)

    Pairwise comparisons using Log-Rank test 

data:  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens and clus_pam_om7 

                                          6035, Un trimestre, TSM(6)
6025, Un trimestre, TUS(5)                0.37                      
5939, Un semestre TSM(3)                  0.48                      
5989, Comorbilidad un trimestre(4)        1.00                      
6036, TSM, 1 año después, otras causas(7) 1.00                      
5710, TSM, 1 año después, TSM(1)          1.00                      
5935, TSM, 6 meses después, TSM(2)        1.00                      
                                          6025, Un trimestre, TUS(5)
6025, Un trimestre, TUS(5)                -                         
5939, Un semestre TSM(3)                  1.00                      
5989, Comorbilidad un trimestre(4)        1.00                      
6036, TSM, 1 año después, otras causas(7) 1.00                      
5710, TSM, 1 año después, TSM(1)          1.00                      
5935, TSM, 6 meses después, TSM(2)        1.00                      
                                          5939, Un semestre TSM(3)
6025, Un trimestre, TUS(5)                -                       
5939, Un semestre TSM(3)                  -                       
5989, Comorbilidad un trimestre(4)        1.00                    
6036, TSM, 1 año después, otras causas(7) 1.00                    
5710, TSM, 1 año después, TSM(1)          1.00                    
5935, TSM, 6 meses después, TSM(2)        1.00                    
                                          5989, Comorbilidad un trimestre(4)
6025, Un trimestre, TUS(5)                -                                 
5939, Un semestre TSM(3)                  -                                 
5989, Comorbilidad un trimestre(4)        -                                 
6036, TSM, 1 año después, otras causas(7) 1.00                              
5710, TSM, 1 año después, TSM(1)          1.00                              
5935, TSM, 6 meses después, TSM(2)        1.00                              
                                          6036, TSM, 1 año después, otras causas(7)
6025, Un trimestre, TUS(5)                -                                        
5939, Un semestre TSM(3)                  -                                        
5989, Comorbilidad un trimestre(4)        -                                        
6036, TSM, 1 año después, otras causas(7) -                                        
5710, TSM, 1 año después, TSM(1)          1.00                                     
5935, TSM, 6 meses después, TSM(2)        1.00                                     
                                          5710, TSM, 1 año después, TSM(1)
6025, Un trimestre, TUS(5)                -                               
5939, Un semestre TSM(3)                  -                               
5989, Comorbilidad un trimestre(4)        -                               
6036, TSM, 1 año después, otras causas(7) -                               
5710, TSM, 1 año después, TSM(1)          -                               
5935, TSM, 6 meses después, TSM(2)        1.00                            

P value adjustment method: holm 
Código
cat("Sin siluetas negativas")
Sin siluetas negativas
Código
surv_diff_7c_neg_sil <- survdiff(Surv(time = death_time,
                 event = ifelse(death_time==20,0,1)) ~ clus_pam_om7,
                      data = subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q))

# Mostrar los resultados del test
print(surv_diff_7c_neg_sil)
Call:
survdiff(formula = Surv(time = death_time, event = ifelse(death_time == 
    20, 0, 1)) ~ clus_pam_om7, data = subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, 
    !rn %in% sil_neg_pam_om_clus7_q))

                                                          N Observed Expected
clus_pam_om7=6035, Un trimestre, TSM(6)                4372       40    50.20
clus_pam_om7=6025, Un trimestre, TUS(5)                 680       13     7.79
clus_pam_om7=5939, Un semestre TSM(3)                   313        7     3.59
clus_pam_om7=5989, Comorbilidad un trimestre(4)         205        4     2.34
clus_pam_om7=6036, TSM, 1 año después, otras causas(7)  166        2     1.90
clus_pam_om7=5710, TSM, 1 año después, TSM(1)            56        1     0.64
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)         134        1     1.54
                                                       (O-E)^2/E (O-E)^2/V
clus_pam_om7=6035, Un trimestre, TSM(6)                  2.07321   7.92111
clus_pam_om7=6025, Un trimestre, TUS(5)                  3.49278   3.94444
clus_pam_om7=5939, Un semestre TSM(3)                    3.24399   3.42476
clus_pam_om7=5989, Comorbilidad un trimestre(4)          1.17785   1.21984
clus_pam_om7=6036, TSM, 1 año después, otras causas(7)   0.00474   0.00488
clus_pam_om7=5710, TSM, 1 año después, TSM(1)            0.20232   0.20425
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)          0.18910   0.19349

 Chisq= 10.4  on 6 degrees of freedom, p= 0.1 
Código
pairwise_survdiff(
    formula = Surv(time = death_time,
                 event = ifelse(death_time==20,0,1)) ~ clus_pam_om7,
    data = subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), rho=0,
    p.adjust.method = "holm"
)

    Pairwise comparisons using Log-Rank test 

data:  subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens,  and clus_pam_om7     !rn %in% sil_neg_pam_om_clus7_q) and clus_pam_om7 

                                          6035, Un trimestre, TSM(6)
6025, Un trimestre, TUS(5)                0.37                      
5939, Un semestre TSM(3)                  0.48                      
5989, Comorbilidad un trimestre(4)        1.00                      
6036, TSM, 1 año después, otras causas(7) 1.00                      
5710, TSM, 1 año después, TSM(1)          1.00                      
5935, TSM, 6 meses después, TSM(2)        1.00                      
                                          6025, Un trimestre, TUS(5)
6025, Un trimestre, TUS(5)                -                         
5939, Un semestre TSM(3)                  1.00                      
5989, Comorbilidad un trimestre(4)        1.00                      
6036, TSM, 1 año después, otras causas(7) 1.00                      
5710, TSM, 1 año después, TSM(1)          1.00                      
5935, TSM, 6 meses después, TSM(2)        1.00                      
                                          5939, Un semestre TSM(3)
6025, Un trimestre, TUS(5)                -                       
5939, Un semestre TSM(3)                  -                       
5989, Comorbilidad un trimestre(4)        1.00                    
6036, TSM, 1 año después, otras causas(7) 1.00                    
5710, TSM, 1 año después, TSM(1)          1.00                    
5935, TSM, 6 meses después, TSM(2)        1.00                    
                                          5989, Comorbilidad un trimestre(4)
6025, Un trimestre, TUS(5)                -                                 
5939, Un semestre TSM(3)                  -                                 
5989, Comorbilidad un trimestre(4)        -                                 
6036, TSM, 1 año después, otras causas(7) 1.00                              
5710, TSM, 1 año después, TSM(1)          1.00                              
5935, TSM, 6 meses después, TSM(2)        1.00                              
                                          6036, TSM, 1 año después, otras causas(7)
6025, Un trimestre, TUS(5)                -                                        
5939, Un semestre TSM(3)                  -                                        
5989, Comorbilidad un trimestre(4)        -                                        
6036, TSM, 1 año después, otras causas(7) -                                        
5710, TSM, 1 año después, TSM(1)          1.00                                     
5935, TSM, 6 meses después, TSM(2)        1.00                                     
                                          5710, TSM, 1 año después, TSM(1)
6025, Un trimestre, TUS(5)                -                               
5939, Un semestre TSM(3)                  -                               
5989, Comorbilidad un trimestre(4)        -                               
6036, TSM, 1 año después, otras causas(7) -                               
5710, TSM, 1 año después, TSM(1)          -                               
5935, TSM, 6 meses después, TSM(2)        1.00                            

P value adjustment method: holm 
Código
# Ajustar el modelo de Kaplan-Meier
km_fit_7c <- survfit(surv_obj_7c ~ clus_pam_om7,
                  data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens)

# Extraer los datos del modelo Kaplan-Meier para usar con ggplot
km_data_7c <- data.frame(
  time = km_fit_7c$time,
  surv = km_fit_7c$surv,
  upper = km_fit_7c$upper,
  lower = km_fit_7c$lower,
  strata = rep(c("6035, Un trimestre, TSM(6)", "6025, Un trimestre, TUS(5)", 
"5939, Un semestre TSM(3)", "5989, Comorbilidad un trimestre(4)", 
"6036, TSM, 1 año después, otras causas(7)", "5710, TSM, 1 año después, TSM(1)", 
"5935, TSM, 6 meses después, TSM(2)"), km_fit_7c$strata)
)

biostat3::survRate(Surv(time = death_time,
                 event = ifelse(death_time==20,0,1)) ~ clus_pam_om7, 
                   data= ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens)  %>% 
  dplyr::mutate(across(c("rate", "lower", "upper"),~sprintf("%1.2f",.*10000))) 
                                                                                    clus_pam_om7
clus_pam_om7=6035, Un trimestre, TSM(6)                               6035, Un trimestre, TSM(6)
clus_pam_om7=6025, Un trimestre, TUS(5)                               6025, Un trimestre, TUS(5)
clus_pam_om7=5939, Un semestre TSM(3)                                   5939, Un semestre TSM(3)
clus_pam_om7=5989, Comorbilidad un trimestre(4)               5989, Comorbilidad un trimestre(4)
clus_pam_om7=6036, TSM, 1 año después, otras causas(7) 6036, TSM, 1 año después, otras causas(7)
clus_pam_om7=5710, TSM, 1 año después, TSM(1)                   5710, TSM, 1 año después, TSM(1)
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)               5935, TSM, 6 meses después, TSM(2)
                                                           tstop event  rate
clus_pam_om7=6035, Un trimestre, TSM(6)                86874.069    40  4.60
clus_pam_om7=6025, Un trimestre, TUS(5)                13438.762    13  9.67
clus_pam_om7=5939, Un semestre TSM(3)                   6186.389     7 11.32
clus_pam_om7=5989, Comorbilidad un trimestre(4)         4041.071     4  9.90
clus_pam_om7=6036, TSM, 1 año después, otras causas(7)  3754.653     2  5.33
clus_pam_om7=5710, TSM, 1 año después, TSM(1)           2809.175     3 10.68
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)         2724.808     1  3.67
                                                       lower upper
clus_pam_om7=6035, Un trimestre, TSM(6)                 3.29  6.27
clus_pam_om7=6025, Un trimestre, TUS(5)                 5.15 16.54
clus_pam_om7=5939, Un semestre TSM(3)                   4.55 23.31
clus_pam_om7=5989, Comorbilidad un trimestre(4)         2.70 25.34
clus_pam_om7=6036, TSM, 1 año después, otras causas(7)  0.65 19.24
clus_pam_om7=5710, TSM, 1 año después, TSM(1)           2.20 31.21
clus_pam_om7=5935, TSM, 6 meses después, TSM(2)         0.09 20.45
Código
biostat3::survRate(Surv(time = death_time,
                        event = ifelse(death_time==20,0,1)) ~ clus1, 
                   data= ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens |> dplyr::mutate(clus1= ifelse(grepl("6035",clus_pam_om7),"1","0")))  %>% 
    dplyr::mutate(across(c("rate", "lower", "upper"),~sprintf("%1.2f",.*10000))) 
        clus1    tstop event rate lower upper
clus1=0     0 32954.86    30 9.10  6.14 13.00
clus1=1     1 86874.07    40 4.60  3.29  6.27
Código
cat("Diferencia multiplicativa entre cluster TSM 1 trimestre y el resto")
Diferencia multiplicativa entre cluster TSM 1 trimestre y el resto
Código
epitools::rateratio.midp(c(30, 40,  32954.86, 86874.07))
$data
          Outcome
Predictor  Cases Person-time
  Exposed1    30    32954.86
  Exposed2    40    86874.07
  Total       70   119828.93

$measure
          rate ratio with 95% C.I.
Predictor   estimate     lower     upper
  Exposed1 1.0000000        NA        NA
  Exposed2 0.5050934 0.3151074 0.8185231

$p.value
          two-sided
Predictor   midp.exact        wald
  Exposed1          NA          NA
  Exposed2 0.005997277 0.004012102

attr(,"method")
[1] "Median unbiased estimate & mid-p exact CI"
Código
# Crear el gráfico de Kaplan-Meier con ggplot2
ggplot(km_data_7c, aes(x = time, y = surv, color = strata)) +
  geom_step(size = 1.2) +  # Curvas de supervivencia
  #geom_ribbon(aes(ymin = lower, ymax = upper, fill = strata), alpha = 0.2, color = NA) +  # Intervalos de confianza
  labs(
    title = "Curvas de Kaplan-Meier",
    x = "Tiempo (meses)",
    y = "Probabilidad de Supervivencia",
    color = "Grupo",
    fill = "Grupo"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom") 

Tiempo que demora esta sección: 0 minutos

1.2.3.c. Comparación covariables- no RM vs. RM
Código
chisq_cramerv(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base))
# $chisq_statistic
# [1] "38.64"
# 
# $chisq_df
# df 
#  3 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.08"

cat("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(codigo_region_rec_base , clus_pam_om7))
)


table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base) %>% 
    data.frame() |>  
    dplyr::group_by(Var1) |> 
    dplyr::mutate(perc= scales::percent(Freq/sum(Freq), accuracy=.1)) |> 
    dplyr::ungroup() |> 
    dplyr::mutate(Freq= Freq)  |>
    dplyr::mutate(fp= paste0(Freq, " (", perc,")" )) |> 
    dplyr::select(-Freq, -perc) |> 
    tidyr::pivot_wider(names_from="Var2",values_from="fp")  |> 
  knitr::kable("markdown", caption="Frecuencias absolutas y relativas por fila", col.names= c("Conglomerados", "Fuera de RM", "En RM"))
$chisq_statistic
[1] "42.09"

$chisq_df
df 
 6 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.08"

Descartando valores negativos en sil width$chisq_statistic
[1] "40.58"

$chisq_df
df 
 6 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.08"
Frecuencias absolutas y relativas por fila
Conglomerados Fuera de RM En RM
6035, Un trimestre, TSM(6) 2356 (53.9%) 2016 (46.1%)
6025, Un trimestre, TUS(5) 430 (63.2%) 250 (36.8%)
5939, Un semestre TSM(3) 158 (50.5%) 155 (49.5%)
5989, Comorbilidad un trimestre(4) 85 (41.5%) 120 (58.5%)
6036, TSM, 1 año después, otras causas(7) 95 (50.3%) 94 (49.7%)
5710, TSM, 1 año después, TSM(1) 67 (47.2%) 75 (52.8%)
5935, TSM, 6 meses después, TSM(2) 70 (51.1%) 67 (48.9%)

Tiempo que demora esta sección: 0 minutos

Al parecer, el conglomerado 6025, Un trimestre, TUS(5) tendría una proporción significativamente mayor que el resto de pacientes fuera de la RM, aunque con una fuerza de asociación débil. En contraste, el conglomerado 5939, Un semestre TSM(3) tiene una proporción mayor de personas en la RM.

Código
new_labels <- c(
  grp1  = "6035, Un trimestre, TSM(6) - Fuera de RM",
  grp2  = "6025, Un trimestre, TUS(5) - Fuera de RM",
  grp3  = "5939, Un semestre TSM(3) - Fuera de RM",
  grp4  = "5989, Comorbilidad un trimestre(4) - Fuera de RM",
  grp5  = "6036, TSM, 1 año después, otras causas(7) - Fuera de RM",
  grp6  = "5710, TSM, 1 año después, TSM(1) - Fuera de RM",
  grp7  = "5935, TSM, 6 meses después, TSM(2) - Fuera de RM",
  grp8  = "6035, Un trimestre, TSM(6) - En RM",
  grp9  = "6025, Un trimestre, TUS(5) - En RM",
  grp10 = "5939, Un semestre TSM(3) - En RM",
  grp11 = "5989, Comorbilidad un trimestre(4) - En RM",
  grp12 = "6036, TSM, 1 año después, otras causas(7) - En RM",
  grp13 = "5710, TSM, 1 año después, TSM(1) - En RM",
  grp14 = "5935, TSM, 6 meses después, TSM(2) - En RM"
)

pairwise_chisq_gof_test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base), p.adjust.method="holm")|> 
   dplyr::mutate(
    group1 = new_labels[group1],
    group2 = new_labels[group2]
  ) |> 
  dplyr::filter(!grepl("Fuera de", group1)) |> 
  dplyr::filter(!grepl("Fuera de", group2)) |> 
  dplyr::mutate(
    p_value = ifelse(p.adj <.001, "<.001", sprintf("%1.3f",p.adj)) 
  ) |>
  dplyr::select(group1, group2, p_value) |> 
  knitr::kable("markdown", caption="Dependencia categórica sol. 7 conglomerados, por pares de categorías en RM")
Dependencia categórica sol. 7 conglomerados, por pares de categorías en RM
group1 group2 p_value
6035, Un trimestre, TSM(6) - En RM 6025, Un trimestre, TUS(5) - En RM <.001
6035, Un trimestre, TSM(6) - En RM 5939, Un semestre TSM(3) - En RM <.001
6035, Un trimestre, TSM(6) - En RM 5989, Comorbilidad un trimestre(4) - En RM <.001
6035, Un trimestre, TSM(6) - En RM 6036, TSM, 1 año después, otras causas(7) - En RM <.001
6035, Un trimestre, TSM(6) - En RM 5710, TSM, 1 año después, TSM(1) - En RM <.001
6035, Un trimestre, TSM(6) - En RM 5935, TSM, 6 meses después, TSM(2) - En RM <.001
6025, Un trimestre, TUS(5) - En RM 5939, Un semestre TSM(3) - En RM <.001
6025, Un trimestre, TUS(5) - En RM 5989, Comorbilidad un trimestre(4) - En RM <.001
6025, Un trimestre, TUS(5) - En RM 6036, TSM, 1 año después, otras causas(7) - En RM <.001
6025, Un trimestre, TUS(5) - En RM 5710, TSM, 1 año después, TSM(1) - En RM <.001
6025, Un trimestre, TUS(5) - En RM 5935, TSM, 6 meses después, TSM(2) - En RM <.001
5939, Un semestre TSM(3) - En RM 5989, Comorbilidad un trimestre(4) - En RM 0.766
5939, Un semestre TSM(3) - En RM 6036, TSM, 1 año después, otras causas(7) - En RM 0.004
5939, Un semestre TSM(3) - En RM 5710, TSM, 1 año después, TSM(1) - En RM <.001
5939, Un semestre TSM(3) - En RM 5935, TSM, 6 meses después, TSM(2) - En RM <.001
5989, Comorbilidad un trimestre(4) - En RM 6036, TSM, 1 año después, otras causas(7) - En RM 1.000
5989, Comorbilidad un trimestre(4) - En RM 5710, TSM, 1 año después, TSM(1) - En RM 0.036
5989, Comorbilidad un trimestre(4) - En RM 5935, TSM, 6 meses después, TSM(2) - En RM 0.004
6036, TSM, 1 año después, otras causas(7) - En RM 5710, TSM, 1 año después, TSM(1) - En RM 1.000
6036, TSM, 1 año después, otras causas(7) - En RM 5935, TSM, 6 meses después, TSM(2) - En RM 0.766
5710, TSM, 1 año después, TSM(1) - En RM 5935, TSM, 6 meses después, TSM(2) - En RM 1.000

Tiempo que demora esta sección: 0 minutos

Código
chisq.posthoc.test(
table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam_om7,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base)
) %>% 
  dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
  group_by(Dimension) %>%
  summarise(across(2:(ncol(.)-1),
                   ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
  dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-RM vs. No-RM")
Comparación post-hoc, conglomerado-RM vs. No-RM
Dimension noRM RM
5710, TSM, 1 año después, TSM(1) -1.65 (p=1.000) 1.65 (p=1.000)
5935, TSM, 6 meses después, TSM(2) -0.69 (p=1.000) 0.69 (p=1.000)
5939, Un semestre TSM(3) -1.29 (p=1.000) 1.29 (p=1.000)
5989, Comorbilidad un trimestre(4) -3.67 (p=0.003) 3.67 (p=0.003)
6025, Un trimestre, TUS(5) 5.12 (p<0.001) -5.12 (p<0.001)
6035, Un trimestre, TSM(6) -0.30 (p=1.000) 0.30 (p=1.000)
6036, TSM, 1 año después, otras causas(7) -1.05 (p=1.000) 1.05 (p=1.000)

Tiempo que demora esta sección: 0 minutos

De la tabla anterior, se observa que participantes pertenecientes al conglomerado “6025, Un trimestre, TUS(3)” presenta una menor proporción de residentes de la Región Metropolitana. Por otra parte, participantes pertenecientes al conglomerado ” 5989, Comorbilidad un trimestre(2)” pertenecen en mayor proporción a la RM.

1.2.3.e. Comparación covariables- Región
Código
tab_cluster_region_pam_om7_q<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_pam_om7) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2)

#colnames(tab_cluster_region_pam_om4_q)<- c("reg", "c1", "c4", "c3", "c5", "c6", "c7", "c8", "c9", "c2")
cod_reg_homo_pam_om7_q<-
data.frame(
  codigo_region = 1:16,
  nombre_region = c(
    "Región de Tarapacá",
    "Región de Antofagasta",
    "Región de Atacama",
    "Región de Coquimbo",
    "Región de Valparaíso",
    "Región del Libertador General Bernardo O'Higgins",
    "Región del Maule",
    "Región del Biobío",
    "Región de La Araucanía",
    "Región de Los Lagos",
    "Región de Aysén del General Carlos Ibáñez del Campo",
    "Región de Magallanes y de la Antártica Chilena",
    "Región Metropolitana de Santiago",
    "Región de Los Ríos",
    "Región de Arica y Parinacota",
    "Región de Ñuble"
  ),
  stringsAsFactors = FALSE
)

dplyr::mutate(tab_cluster_region_pam_om7_q, promedio_fila = rowMeans(across(2:length(colnames(tab_cluster_region_pam_om7_q))))) %>% 
  dplyr::arrange(desc(promedio_fila)) %>% 
  dplyr::left_join(cod_reg_homo_pam_om7_q, by="codigo_region") %>% 
  dplyr::select(codigo_region, nombre_region, everything()) %>% 
  dplyr::select(-promedio_fila) %>% 
  dplyr::mutate_at(3:(length(colnames(tab_cluster_region_pam_om7_q))+1),~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentaje por región")
Porcentaje por región
codigo_region nombre_region 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
13 Región Metropolitana de Santiago 45% 36% 48% 57% 44.0% 46% 46%
8 Región del Biobío 10% 9% 9% 9% 12.0% 11% 12%
5 Región de Valparaíso 9% 13% 10% 6% 5.0% 8% 9%
10 Región de Los Lagos 6% 20% 5% 10% 7.0% 1% 9%
7 Región del Maule 4% 3% 3% 4% 8.0% 4% 4%
9 Región de La Araucanía 5% 4% 5% 4% 3.0% 5% 4%
6 Región del Libertador General Bernardo O’Higgins 4% 3% 5% 2% 4.0% 1% 1%
14 Región de Los Ríos 3% 3% 2% 0% 2.0% 3% 3%
1 Región de Tarapacá 2% 1% 1% 1% 2.0% 6% 2%
12 Región de Magallanes y de la Antártica Chilena 1% 2% 2% 1% 2.0% 4% 3%
2 Región de Antofagasta 2% 1% 4% 1% 1.0% 4% 1%
16 Región de Ñuble 2% 2% 2% 1% 3.0% 4% 0%
11 Región de Aysén del General Carlos Ibáñez del Campo 2% 2% 1% 3% 2.0% 1% 1%
3 Región de Atacama 2% 1% 2% 0% 1.0% 1% 1%
4 Región de Coquimbo 1% 1% 1% 0% 2.0% 1% 1%
15 Región de Arica y Parinacota 2% 0% 0% 0% 3.0% 1% 1%

Tiempo que demora esta sección: 0 minutos

A partir de la tabla, salta a la vista un importante porcentaje de pacientes clasificados en el conglomerado 6025, Un trimestre, TUS (20%) que fue atendido en la Región de Los Lagos. 5989, Comorbilidad un trimestre(4) y 6036, TSM, 1 año después, otras causas(7) se encuentran en menor proporción en la Región de Valparaíso (~5%), en contraste con 6025, Un trimestre, TUS(5) (13%). Por otra parte, un 8% de los pacientes clasificados en 6036, TSM, 1 año después, otras causas(7) fue atendido en la Región del Maule.

Código
tab_clus_reg_pam_om7_q<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region, clus_pam_om7)

chisq_cramerv(tab_clus_reg_pam_om7_q[,-1])
# $chisq_statistic
# [1] "301.25"
# 
# $chisq_df
# df 
# 90 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.09"

janitor::fisher.test(tab_clus_reg_pam_om7_q, simulate.p.value=T, B=1e5)
#p-value = 1e-05

cat("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q)%>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") , table(codigo_region , clus_pam_om7))
)
$chisq_statistic
[1] "301.25"

$chisq_df
df 
90 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.09"


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  tab_clus_reg_pam_om7_q
p-value = 1e-05
alternative hypothesis: two.sided

Descartando valores negativos en sil width$chisq_statistic
[1] "293.14"

$chisq_df
df 
90 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.09"

Tiempo que demora esta sección: 0 minutos

Se encuentra una asociación significativa aunque débil entre región y conglomerados.

Por macrozona

Código
tab_clus_macrozona_pam_om7_q<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) %>% 
  janitor::tabyl(macrozona, clus_pam_om7) 

chisq_cramerv(dplyr::filter(tab_clus_macrozona_pam_om7_q,macrozona!="RM")[,-1])
# $chisq_statistic
# [1] "100.60"
# 
# $chisq_df
# df 
# 24 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.09"


cat("Descartando valores negativos en sil width")
chisq_cramerv(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q)%>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) |> dplyr::filter(macrozona!="RM"), table(macrozona, clus_pam_om7))
)
# $chisq_statistic
# [1] "108.21"
# 
# $chisq_df
# df 
# 24 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.09"


fisher.test(
with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q)%>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) |> dplyr::filter(macrozona!="RM"), table(macrozona, clus_pam_om7)),simulate.p.value=T, B=1e5
)

tab_clus_macrozona_pam_om7_q %>% 
  dplyr::filter(macrozona!="RM") |> 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
    dplyr::mutate(across(-macrozona, ~ sprintf("%d (%.1f%%)", 
  dplyr::filter(tab_clus_macrozona_pam_om7_q,macrozona!="RM")[[cur_column()]], . * 100))) |> 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. macrozona")
$chisq_statistic
[1] "100.60"

$chisq_df
df 
24 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.09"

Descartando valores negativos en sil width$chisq_statistic
[1] "108.21"

$chisq_df
df 
24 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.09"


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  with(dplyr::filter(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q) %>% dplyr::inner_join(data_long_establecimiento_2024_std[, c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], by = c(estab_homo_base = "ESTAB_HOMO"), multiple = "first") %>% dplyr::mutate(macrozona = dplyr::case_when(codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte", codigo_region %in% c(4, 5) ~ "Macrozona Centro", codigo_region %in% c(6, 7,      16, 8) ~ "Macrozona Centro Sur", codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur", codigo_region %in% c(11, 12) ~ "Macrozona Austral", TRUE ~ "RM")), macrozona != "RM"), table(macrozona, clus_pam_om7))
p-value = 1e-05
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. macrozona
macrozona 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
Macrozona Austral 146 (6.0%) 27 (6.2%) 9 (5.5%) 8 (9.0%) 7 (6.7%) 6 (7.9%) 6 (8.1%)
Macrozona Centro 423 (17.5%) 90 (20.5%) 33 (20.1%) 12 (13.5%) 12 (11.4%) 12 (15.8%) 14 (18.9%)
Macrozona Centro Sur 875 (36.2%) 114 (26.0%) 60 (36.6%) 33 (37.1%) 52 (49.5%) 28 (36.8%) 24 (32.4%)
Macrozona Norte 368 (15.2%) 27 (6.2%) 25 (15.2%) 5 (5.6%) 12 (11.4%) 17 (22.4%) 8 (10.8%)
Macrozona Sur 606 (25.1%) 180 (41.1%) 37 (22.6%) 31 (34.8%) 22 (21.0%) 13 (17.1%) 22 (29.7%)

Tiempo que demora esta sección: 0 minutos

Hay una asociación significativa aunque débil entre macrozona y pertenencia a cluster.

Los conglomerados 5989, Comorbilidad un trimestre (4) y 6036, TSM, 1 año después, otras causas (7) concentran un porcentaje reducido en la Macrozona Centro (~6%). En contraste, este último conglomerado alcanza una mayor proporción en la Macrozona Centro Sur (28%). Por otro lado, el conglomerado 5710, TSM, 1 año después, TSM (1) registra su mayor porcentaje en la Macrozona Norte (12%), mientras que el conglomerado 5989, Comorbilidad un trimestre (4) representa solo un 2% en esa misma macrozona. En la Macrozona Sur, los pacientes del conglomerado 6025, Un trimestre, TUS (5) tienen la mayor proporción (26%), en comparación con el conglomerado 5710, TSM, 1 año después, TSM (1), que alcanza solo un 9%.

Código
chisq.posthoc.test(dplyr::filter(tab_clus_macrozona_pam_om7_q,macrozona!="RM")[-1]) %>% 
  dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
  group_by(Dimension) %>%
  summarise(across(2:(ncol(.)-1),
                   ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
  dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
  dplyr::mutate(Dimension= dplyr::filter(tab_clus_macrozona_pam_om7_q,macrozona!="RM")[1]) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Macrozona")
Comparación post-hoc, conglomerado-Macrozona
Dimension 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
Macrozona Austral -0.67 (p=1.000) -0.04 (p=1.000) -0.39 (p=1.000) 1.10 (p=1.000) 0.20 (p=1.000) 0.61 (p=1.000) 0.68 (p=1.000)
Macrozona Centro -0.54 (p=1.000) 1.66 (p=1.000) 0.83 (p=1.000) -1.06 (p=1.000) -1.72 (p=1.000) -0.44 (p=1.000) 0.27 (p=1.000)
Macrozona Centro Sur 1.81 (p=1.000) -4.33 (p<0.001) 0.36 (p=1.000) 0.36 (p=1.000) 3.11 (p=0.066) 0.29 (p=1.000) -0.51 (p=1.000)
Macrozona Norte 4.00 (p=0.002) -4.93 (p<0.001) 0.58 (p=1.000) -2.25 (p=0.846) -0.70 (p=1.000) 2.21 (p=0.944) -0.74 (p=1.000)
Macrozona Sur -4.21 (p=0.001) 7.08 (p<0.001) -1.34 (p=1.000) 1.67 (p=1.000) -1.44 (p=1.000) -1.98 (p=1.000) 0.52 (p=1.000)

Tiempo que demora esta sección: 0 minutos

Código
pairwise_chisq_gof_test(dplyr::filter(tab_clus_macrozona_pam_om7_q,macrozona!="RM")[-1], p.adjust.method="holm")|>
  knitr::kable("markdown", caption="Dependencia categórica sol. 7 conglomerados, por pares de categorías en Macrozona (corrección Holm-Bonferroni)")

#Groups sharing a letter are not significantlt different (alpha = 0.05)
Dependencia categórica sol. 7 conglomerados, por pares de categorías en Macrozona (corrección Holm-Bonferroni)
n group1 group2 statistic p df p.adj p.adj.signif
2856 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 69.612238 0.00e+00 4 0.00e+00 ****
2582 6035, Un trimestre, TSM(6) 5939, Un semestre TSM(3) 1.070704 8.99e-01 4 1.00e+00 ns
2507 6035, Un trimestre, TSM(6) 5989, Comorbilidad un trimestre(4) 10.574181 3.18e-02 4 5.09e-01 ns
2523 6035, Un trimestre, TSM(6) 6036, TSM, 1 año después, otras causas(7) 8.727121 6.83e-02 4 9.56e-01 ns
2494 6035, Un trimestre, TSM(6) 5710, TSM, 1 año después, TSM(1) 4.867423 3.01e-01 4 1.00e+00 ns
2492 6035, Un trimestre, TSM(6) 5935, TSM, 6 meses después, TSM(2) 2.413760 6.60e-01 4 1.00e+00 ns
602 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 27.463633 1.60e-05 4 2.88e-04 ***
527 6025, Un trimestre, TUS(5) 5989, Comorbilidad un trimestre(4) 6.796041 1.47e-01 4 1.00e+00 ns
543 6025, Un trimestre, TUS(5) 6036, TSM, 1 año después, otras causas(7) 31.585051 2.30e-06 4 4.43e-05 ****
514 6025, Un trimestre, TUS(5) 5710, TSM, 1 año después, TSM(1) 33.574321 9.00e-07 4 1.82e-05 ****
512 6025, Un trimestre, TUS(5) 5935, TSM, 6 meses después, TSM(2) 5.489528 2.41e-01 4 1.00e+00 ns
253 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 10.225693 3.68e-02 4 5.52e-01 ns
269 5939, Un semestre TSM(3) 6036, TSM, 1 año después, otras causas(7) 6.368393 1.73e-01 4 1.00e+00 ns
240 5939, Un semestre TSM(3) 5710, TSM, 1 año después, TSM(1) 3.250521 5.17e-01 4 1.00e+00 ns
238 5939, Un semestre TSM(3) 5935, TSM, 6 meses después, TSM(2) 2.621867 6.23e-01 4 1.00e+00 ns
194 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 7.455505 1.14e-01 4 1.00e+00 ns
165 5989, Comorbilidad un trimestre(4) 5710, TSM, 1 año después, TSM(1) 13.665226 8.44e-03 4 1.43e-01 ns
163 5989, Comorbilidad un trimestre(4) 5935, TSM, 6 meses después, TSM(2) 2.723922 6.05e-01 4 1.00e+00 ns
181 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5.959863 2.02e-01 4 1.00e+00 ns
179 6036, TSM, 1 año después, otras causas(7) 5935, TSM, 6 meses después, TSM(2) 6.162680 1.87e-01 4 1.00e+00 ns
150 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2) 5.990222 2.00e-01 4 1.00e+00 ns

Tiempo que demora esta sección: 0 minutos

Las pruebas post-hoc muestran que un mayor porcentaje de pacientes 6035, Un trimestre, TSM(6) se concentran en la macrozona norte y menos en la macrozona sur. En cambio, 6025, Un trimestre, TUS(5) concentra un mayor porcentaje en la macrozona sur y menos en la macrozona norte.

1.2.3.f. Comparación covariables- Sexo
Código
tab_clus_sexo_pam_om7_q<-  
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(glosa_sexo, clus_pam_om7 )

chisq_cramerv(tab_clus_sexo_pam_om7_q[,-1])
# $chisq_statistic
# [1] "262.51"
# 
# $chisq_df
# df 
#  6 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.21"
#  
cat("Descartando valores negativos en sil width")
chisq_cramerv(with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(glosa_sexo, clus_pam_om7))
)

tab_clus_sexo_pam_om7_q%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate(across(-glosa_sexo, ~sprintf("%d (%.1f%%)", tab_clus_sexo_pam_om7_q[[cur_column()]],.*100)))|> 
  #dplyr::mutate_at(2:ncol(.),~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. sexo")
$chisq_statistic
[1] "262.51"

$chisq_df
df 
 6 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.21"

Descartando valores negativos en sil width$chisq_statistic
[1] "263.78"

$chisq_df
df 
 6 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.21"
Porcentajes por columna, conglomerado vs. sexo
glosa_sexo 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
HOMBRE 1856 (42.5%) 478 (70.3%) 128 (40.9%) 142 (69.3%) 59 (31.2%) 59 (41.5%) 42 (30.7%)
MUJER 2516 (57.5%) 202 (29.7%) 185 (59.1%) 63 (30.7%) 130 (68.8%) 83 (58.5%) 95 (69.3%)

Tiempo que demora esta sección: 0 minutos

Hay una asociación con una fuerza débil-moderada entre la pertenencia a un conglomerado y el sexo. 6025, Un trimestre, TUS(5) y 5989, Comorbilidad un trimestre(4) concentran un mayor porcentaje de pacientes hombres (~70%). En contraste, 6036, TSM, 1 año después, otras causas(7) y 5935, TSM, 6 meses después, TSM(2) concentran un mayor porcentaje de mujeres (~69%).

Código
chisq.posthoc.test(tab_clus_sexo_pam_om7_q[-1])%>% 
    dplyr::mutate(Dimension= rep(c("HOMBRE", "MUJER"), each=2)) %>% 
    dplyr::filter(Dimension=="MUJER") %>%
    dplyr::mutate(across(3:ncol(.), ~ dplyr::case_when(Value=="Residuals"~ sprintf("%1.2f", as.numeric(.)), Value=="p values"~ sprintf("%1.3f", as.numeric(gsub("\\*","",.)))))) %>% 
  dplyr::mutate(across(3:ncol(.), ~ dplyr::case_when(Value=="p values" & .=="0.000"~"<0.001",T~.))) %>% 
  knitr::kable("markdown", caption="Post-hoc, conglomerado vs. sexo")
Post-hoc, conglomerado vs. sexo
Dimension Value 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
MUJER Residuals 8.40 -13.62 1.78 -6.87 4.08 1.02 3.59
MUJER p values <0.001 <0.001 1.000 <0.001 0.001 1.000 0.005

Tiempo que demora esta sección: 0 minutos

Código
pairwise_chisq_gof_test(tab_clus_sexo_pam_om7_q[-1], p.adjust.method="holm")|> 
  dplyr::mutate(p= dplyr::case_when(p<0.001~ "<0.001",T~ sprintf("%1.3f",p)))|> 
  dplyr::mutate(p.adj= dplyr::case_when(p.adj<0.001~ "<0.001",T~ sprintf("%1.3f",p.adj)))|> 
  knitr::kable("markdown", caption="Dependencia categórica sol. 7 conglomerados, por pares de categorías en Sexo (corrección Holm-Bonferroni)") 
Dependencia categórica sol. 7 conglomerados, por pares de categorías en Sexo (corrección Holm-Bonferroni)
n group1 group2 statistic p df p.adj p.adj.signif
5052 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 182.4118030 <0.001 1 <0.001 ****
4685 6035, Un trimestre, TSM(6) 5939, Un semestre TSM(3) 0.2298956 0.632 1 1.000 ns
4577 6035, Un trimestre, TSM(6) 5989, Comorbilidad un trimestre(4) 56.1638036 <0.001 1 <0.001 ****
4561 6035, Un trimestre, TSM(6) 6036, TSM, 1 año después, otras causas(7) 8.9328319 0.003 1 0.031 *
4514 6035, Un trimestre, TSM(6) 5710, TSM, 1 año después, TSM(1) 0.0163655 0.898 1 1.000 ns
4509 6035, Un trimestre, TSM(6) 5935, TSM, 6 meses después, TSM(2) 7.1056873 0.008 1 0.077 ns
993 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 76.6621238 <0.001 1 <0.001 ****
885 6025, Un trimestre, TUS(5) 5989, Comorbilidad un trimestre(4) 0.0376805 0.846 1 1.000 ns
869 6025, Un trimestre, TUS(5) 6036, TSM, 1 año después, otras causas(7) 94.0107092 <0.001 1 <0.001 ****
822 6025, Un trimestre, TUS(5) 5710, TSM, 1 año después, TSM(1) 41.5921404 <0.001 1 <0.001 ****
817 6025, Un trimestre, TUS(5) 5935, TSM, 6 meses después, TSM(2) 75.7242289 <0.001 1 <0.001 ****
518 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 38.8329016 <0.001 1 <0.001 ****
502 5939, Un semestre TSM(3) 6036, TSM, 1 año después, otras causas(7) 4.3167312 0.038 1 0.339 ns
455 5939, Un semestre TSM(3) 5710, TSM, 1 año después, TSM(1) 0.0008237 0.977 1 1.000 ns
450 5939, Un semestre TSM(3) 5935, TSM, 6 meses después, TSM(2) 3.8244648 0.050 1 0.404 ns
394 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 55.4644048 <0.001 1 <0.001 ****
347 5989, Comorbilidad un trimestre(4) 5710, TSM, 1 año después, TSM(1) 25.3219783 <0.001 1 <0.001 ****
342 5989, Comorbilidad un trimestre(4) 5935, TSM, 6 meses después, TSM(2) 47.7144351 <0.001 1 <0.001 ****
331 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 3.3362983 0.068 1 0.475 ns
326 6036, TSM, 1 año después, otras causas(7) 5935, TSM, 6 meses después, TSM(2) 0.0000000 1.000 1 1.000 ns
279 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2) 3.1258269 0.077 1 0.475 ns

Tiempo que demora esta sección: 0 minutos

Los conglomerados con mayor porcentaje de mujeres son 6035, Un trimestre, TSM(6), 6036, TSM, 1 año después, otras causas(7) y 5935, TSM, 6 meses después, TSM(2). En cambio,5989, Comorbilidad un trimestre(4) y 6025, Un trimestre, TUS(5) tienen un menor porcentaje de mujeres.

1.2.3.g. Comparación covariables- Edad
Código
dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
    dplyr::filter(quarter == 0) %>%
    dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om7")], by="run") %>%
    dplyr::group_by(clus_pam_om7) %>%
    dplyr::summarise(mean_edad = mean(min_edad_anos),
                     sd= sd(min_edad_anos),
                     p50= quantile(min_edad_anos,.5),
                     ci_lower = quantile(min_edad_anos, 0.25),
                     ci_upper = quantile(min_edad_anos, 0.75)) |> 
      dplyr::mutate(
    edad_ingreso = sprintf(
      "%.2f (%.2f ± %.2f); %.0f [%.0f, %.0f]",
      mean_edad, mean_edad, sd, p50, ci_lower, ci_upper
    )
  ) %>%
  dplyr::select(clus_pam_om7, edad_ingreso) |> 
    #dplyr::mutate_at(2:ncol(.),~scales::percent(.)) %>% 
    knitr::kable(caption="Descriptivos, edad minima de ingreso por conglomerado", digits=2, col.names=c("Conglomerado", "Promedio Desv. Estándar Mediana p025 p975"))
Descriptivos, edad minima de ingreso por conglomerado
Conglomerado Promedio Desv. Estándar Mediana p025 p975
6035, Un trimestre, TSM(6) 20.59 (20.59 ± 4.32); 20 [17, 24]
6025, Un trimestre, TUS(5) 22.51 (22.51 ± 4.31); 23 [19, 26]
5939, Un semestre TSM(3) 19.73 (19.73 ± 4.15); 19 [16, 22]
5989, Comorbilidad un trimestre(4) 21.80 (21.80 ± 4.18); 21 [18, 25]
6036, TSM, 1 año después, otras causas(7) 20.53 (20.53 ± 4.19); 20 [17, 23]
5710, TSM, 1 año después, TSM(1) 20.20 (20.20 ± 4.24); 20 [16, 24]
5935, TSM, 6 meses después, TSM(2) 19.12 (19.12 ± 4.08); 17 [16, 22]

Tiempo que demora esta sección: 0 minutos

Código
dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
  dplyr::filter(quarter == 0) %>%
  dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om7")], by="run") %>%
  dplyr::group_by(clus_pam_om7) %>%
  dplyr::summarise(mean_edad = mean(min_edad_anos),
                   sd= sd(min_edad_anos),
                   ci_lower = mean(min_edad_anos) - qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n()),
                   ci_upper = mean(min_edad_anos) + qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n())) %>% # Plot con ggplot2
ggplot(aes(x = clus_pam_om7, y = mean_edad)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Edad promedio") +
  theme_minimal()+
  coord_flip()+
    theme(
    axis.text.y = element_text(size = 17*.7, face = "bold"),#,margin = margin(l = 7)),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 17*.7, face = "bold"),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 16*.7, face = "bold"),#,margin = margin(t = -15)),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 16*.7, face = "bold"),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 17*.7, face = "bold"),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.2, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 15*.7, face = "bold")            # Tamaño del texto de la leyenda
  ) 

ggsave("_figs/edad_minima_por_cluster_pam_om7_q.png", width=8, height=5, dpi=600)
Edad promedio primer ingreso con intervalo de confianza por conglomerado

Edad promedio primer ingreso con intervalo de confianza por conglomerado

Tiempo que demora esta sección: 0.1 minutos

Código
invisible("Prueba de Levene par igualdad de varianzas")
with(dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om7")], by="run"), car::leveneTest(min_edad_anos, clus_pam_om7))
#Sig.
anova_clus_pam_om7_q <- oneway.test(min_edad_anos ~ clus_pam_om7, 
             data = dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om7")], by="run"),var.equal = T)

with(dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om7")], by="run"), oneway_anova_effect_size (min_edad_anos, clus_pam_om7))

# Ver los resultados del ANOVA
print(anova_clus_pam_om7_q)


cat("Descartando valores negativos en sil width")
with(dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
    dplyr::filter(quarter == 0) %>%
    dplyr::inner_join(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q)[,c("run","clus_pam_om7")], by="run"), 
     oneway.test(min_edad_anos ~ clus_pam_om7,var.equal = F)
     )
Levene's Test for Homogeneity of Variance (center = median)
        Df F value Pr(>F)
group    6  1.4057 0.2082
      6031               
$anova_summary
              Df Sum Sq Mean Sq F value Pr(>F)    
group          6   3184   530.7   28.81 <2e-16 ***
Residuals   6031 111109    18.4                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

$eta_squared
[1] 0.02786208


    One-way analysis of means

data:  min_edad_anos and clus_pam_om7
F = 28.809, num df = 6, denom df = 6031, p-value < 2.2e-16

Descartando valores negativos en sil width
    One-way analysis of means (not assuming equal variances)

data:  min_edad_anos and clus_pam_om7
F = 28.535, num df = 6.00, denom df = 407.74, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

Código
rstatix::games_howell_test(min_edad_anos ~ clus_pam_om7, 
  data =dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam_om7")], by="run")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. Promedio días de tratamiento")


cat("Descartando valores negativos en sil width")
sens_min_anios_clus_pam_om7_q<-
rstatix::games_howell_test(min_edad_anos ~ clus_pam_om7,data = dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
    dplyr::filter(quarter == 0) %>%
    dplyr::inner_join(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q)[,c("run","clus_pam_om7")], by="run")
     )
Post-hoc, conglomerado vs. Promedio días de tratamiento
Conglomerado1 Conglomerado2 Estimación
6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 1.92 [1.40, 2.45], p= <0.001
6035, Un trimestre, TSM(6) 5939, Un semestre TSM(3) -0.85 [-1.58, -0.13], p= 0.009
6035, Un trimestre, TSM(6) 5989, Comorbilidad un trimestre(4) 1.21 [0.32, 2.10], p= 0.001
6035, Un trimestre, TSM(6) 6036, TSM, 1 año después, otras causas(7) -0.05 [-0.98, 0.87], p= 1.000
6035, Un trimestre, TSM(6) 5710, TSM, 1 año después, TSM(1) -0.39 [-1.47, 0.69], p= 0.933
6035, Un trimestre, TSM(6) 5935, TSM, 6 meses después, TSM(2) -1.47 [-2.53, -0.41], p= 0.001
6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) -2.77 [-3.62, -1.93], p= <0.001
6025, Un trimestre, TUS(5) 5989, Comorbilidad un trimestre(4) -0.71 [-1.70, 0.29], p= 0.348
6025, Un trimestre, TUS(5) 6036, TSM, 1 año después, otras causas(7) -1.97 [-3.00, -0.95], p= <0.001
6025, Un trimestre, TUS(5) 5710, TSM, 1 año después, TSM(1) -2.31 [-3.48, -1.14], p= <0.001
6025, Un trimestre, TUS(5) 5935, TSM, 6 meses después, TSM(2) -3.39 [-4.54, -2.24], p= <0.001
5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 2.07 [0.96, 3.17], p= <0.001
5939, Un semestre TSM(3) 6036, TSM, 1 año después, otras causas(7) 0.80 [-0.34, 1.94], p= 0.366
5939, Un semestre TSM(3) 5710, TSM, 1 año después, TSM(1) 0.46 [-0.80, 1.73], p= 0.932
5939, Un semestre TSM(3) 5935, TSM, 6 meses después, TSM(2) -0.62 [-1.87, 0.63], p= 0.761
5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) -1.27 [-2.52, -0.02], p= 0.045
5989, Comorbilidad un trimestre(4) 5710, TSM, 1 año después, TSM(1) -1.60 [-2.97, -0.24], p= 0.010
5989, Comorbilidad un trimestre(4) 5935, TSM, 6 meses después, TSM(2) -2.68 [-4.03, -1.33], p= <0.001
6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) -0.34 [-1.73, 1.05], p= 0.991
6036, TSM, 1 año después, otras causas(7) 5935, TSM, 6 meses después, TSM(2) -1.42 [-2.79, -0.04], p= 0.038
5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2) -1.08 [-2.56, 0.40], p= 0.315
Descartando valores negativos en sil width

Tiempo que demora esta sección: 0 minutos

Si bien la asociación entre edad mínima de ingreso es signifciatva, tiene un tamaño del efecto débil. Particularmente, pacientes clasificados en 6025, Un trimestre, TUS(5) tienden a ser mayores que el resto de los pacientes en otros conglomerados, salvo 5989, Comorbilidad un trimestre(4). Este último es mayor que el resto de los otros conglomerados, ubicándose en torno a los 22-23 años. Por último, 6035, Un trimestre, TSM(6) tiene pacientes con un promedio de edad mayor a 5935, TSM, 6 meses después, TSM(2) y 5939, Un semestre TSM(3).

1.2.3.h. Comparación covariables- Previsión
Código
tab_clus_prev_pam_om7_q<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    janitor::tabyl(prev_benef_rec_post, clus_pam_om7)

tab_clus_prev_pam_om7_q%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }
#X-squared = 36.576, df = 24, p-value = 0.04821
#p-value = 0.03702

tab_clus_prev_pam_om7_q%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate(across(-prev_benef_rec_post, ~sprintf("%d (%.1f%%)", tab_clus_prev_pam_om7_q[[cur_column()]],.*100)))|>
  #dplyr::mutate_at(2:ncol(.),~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios")

    Pearson's Chi-squared test

data:  .
X-squared = 36.576, df = 24, p-value = 0.04821


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.03792
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. Beneficios
prev_benef_rec_post 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
FFAA 192 (4.4%) 13 (1.9%) 12 (3.8%) 3 (1.5%) 3 (1.6%) 1 (0.7%) 6 (4.4%)
FONASA A 1156 (26.4%) 192 (28.2%) 95 (30.4%) 55 (26.8%) 47 (24.9%) 40 (28.2%) 35 (25.5%)
FONASA BC 1404 (32.1%) 217 (31.9%) 98 (31.3%) 79 (38.5%) 71 (37.6%) 51 (35.9%) 43 (31.4%)
FONASA D 517 (11.8%) 98 (14.4%) 35 (11.2%) 26 (12.7%) 18 (9.5%) 14 (9.9%) 13 (9.5%)
ISAPRE 1103 (25.2%) 160 (23.5%) 73 (23.3%) 42 (20.5%) 50 (26.5%) 36 (25.4%) 40 (29.2%)

Tiempo que demora esta sección: 0 minutos

Código
chisq_cramerv(tab_clus_prev_pam_om7_q[,-1])
# $chisq_statistic
# [1] "36.58"
# 
# $chisq_df
# df 
# 24 
# 
# $chisq_p_value
# [1] "0.0482"
# 
# $cramers_v
# [1] "0.04"

cat("Descartando valores negativos en sil width")
chisq_cramerv(with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(prev_benef_rec_post, clus_pam_om7)))

cat("Fisher test para valores ASW negativos")
fisher.test(with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(prev_benef_rec_post, clus_pam_om7)), simulate=T, B=1e5)

subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q) |> 
    janitor::tabyl(prev_benef_rec_post, clus_pam_om7) |> 
  janitor::chisq.test()

chisq.posthoc.test(tab_clus_prev_pam_om7_q[,-1]) %>% 
    dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
    #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
    group_by(Dimension) %>%
    summarise(across(2:(ncol(.)-1),
                     ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
    dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
    #dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=1)","p=1.000)",.)) %>% 
    dplyr::mutate(Dimension= dplyr::pull(tab_clus_prev_pam_om7_q[1])) %>% 
    knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión")

pairwise_chisq_gof_test(tab_clus_prev_pam_om7_q[-1], p.adjust.method="holm")|> 
    knitr::kable("markdown", caption="Dependencia categórica sol. 7 conglomerados, por pares de categorías en Previsión (corrección Holm-Bonferroni)")
$chisq_statistic
[1] "36.58"

$chisq_df
df 
24 

$chisq_p_value
[1] "0.0482"

$cramers_v
[1] "0.04"

Descartando valores negativos en sil width$chisq_statistic
[1] "34.86"

$chisq_df
df 
24 

$chisq_p_value
[1] "0.0705"

$cramers_v
[1] "0.04"

Fisher test para valores ASW negativos
    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q), table(prev_benef_rec_post, clus_pam_om7))
p-value = 0.0618
alternative hypothesis: two.sided


    Pearson's Chi-squared test

data:  janitor::tabyl(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens,     !rn %in% sil_neg_pam_om_clus7_q), prev_benef_rec_post, clus_pam_om7)
X-squared = 34.859, df = 24, p-value = 0.07051
Comparación post-hoc, conglomerado-previsión
Dimension 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
FFAA 3.83 (p=0.004) -2.74 (p=0.212) 0.02 (p=1.000) -1.78 (p=1.000) -1.62 (p=1.000) -1.96 (p=1.000) 0.35 (p=1.000)
FONASA A -1.10 (p=1.000) 0.88 (p=1.000) 1.44 (p=1.000) -0.00 (p=1.000) -0.62 (p=1.000) 0.36 (p=1.000) -0.34 (p=1.000)
FONASA BC -1.07 (p=1.000) -0.35 (p=1.000) -0.47 (p=1.000) 1.87 (p=1.000) 1.51 (p=1.000) 0.88 (p=1.000) -0.28 (p=1.000)
FONASA D -0.45 (p=1.000) 2.11 (p=1.000) -0.42 (p=1.000) 0.33 (p=1.000) -1.04 (p=1.000) -0.77 (p=1.000) -0.90 (p=1.000)
ISAPRE 0.93 (p=1.000) -0.88 (p=1.000) -0.67 (p=1.000) -1.49 (p=1.000) 0.50 (p=1.000) 0.12 (p=1.000) 1.17 (p=1.000)
Dependencia categórica sol. 7 conglomerados, por pares de categorías en Previsión (corrección Holm-Bonferroni)
n group1 group2 statistic p df p.adj p.adj.signif
5052 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 13.5494184 0.00888 4 0.186 ns
4685 6035, Un trimestre, TSM(6) 5939, Un semestre TSM(3) 2.4654796 0.65100 4 1.000 ns
4577 6035, Un trimestre, TSM(6) 5989, Comorbilidad un trimestre(4) 8.3261698 0.08030 4 1.000 ns
4561 6035, Un trimestre, TSM(6) 6036, TSM, 1 año después, otras causas(7) 6.0938006 0.19200 4 1.000 ns
4514 6035, Un trimestre, TSM(6) 5710, TSM, 1 año después, TSM(1) 5.5981947 0.23100 4 1.000 ns
4509 6035, Un trimestre, TSM(6) 5935, TSM, 6 meses después, TSM(2) 1.5040805 0.82600 4 1.000 ns
993 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5.1750225 0.27000 4 1.000 ns
885 6025, Un trimestre, TUS(5) 5989, Comorbilidad un trimestre(4) 3.3280516 0.50500 4 1.000 ns
869 6025, Un trimestre, TUS(5) 6036, TSM, 1 año después, otras causas(7) 5.2920415 0.25900 4 1.000 ns
822 6025, Un trimestre, TUS(5) 5710, TSM, 1 año después, TSM(1) 3.5340138 0.47300 4 1.000 ns
817 6025, Un trimestre, TUS(5) 5935, TSM, 6 meses después, TSM(2) 6.8224984 0.14600 4 1.000 ns
518 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 5.5128745 0.23900 4 1.000 ns
502 5939, Un semestre TSM(3) 6036, TSM, 1 año después, otras causas(7) 5.3921225 0.24900 4 1.000 ns
455 5939, Un semestre TSM(3) 5710, TSM, 1 año después, TSM(1) 4.4649484 0.34700 4 1.000 ns
450 5939, Un semestre TSM(3) 5935, TSM, 6 meses después, TSM(2) 2.3979662 0.66300 4 1.000 ns
394 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 2.5587888 0.63400 4 1.000 ns
347 5989, Comorbilidad un trimestre(4) 5710, TSM, 1 año después, TSM(1) 2.0916342 0.71900 4 1.000 ns
342 5989, Comorbilidad un trimestre(4) 5935, TSM, 6 meses después, TSM(2) 7.2142459 0.12500 4 1.000 ns
331 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 0.9667526 0.91500 4 1.000 ns
326 6036, TSM, 1 año después, otras causas(7) 5935, TSM, 6 meses después, TSM(2) 3.3413904 0.50200 4 1.000 ns
279 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2) 4.7450946 0.31400 4 1.000 ns

Tiempo que demora esta sección: 0 minutos

La asociación es lvemente significativa y muy débil. Si no se incluyen los valores con ASW negativos, la asociación no es significativa.

La revisión de los resultados post-hoc permite observar que 6035, Un trimestre, TSM(6) presenta un mayor porcentaje de pacientes en este conglomerado en una previsión de FFAA. Con todo, esta asociación no es consistente en las distintas pruebas.

1.2.3.i. Comparación covariables- Niv. Complejidad
Código
tab_clus_compl_pam_om7_q<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_pam_om7) 

tab_clus_compl_pam_om7_q%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate(across(-nivel_de_complejidad, ~sprintf("%d (%.1f%%)", tab_clus_compl_pam_om7_q[[cur_column()]],.*100)))|>
  #dplyr::mutate_at(2:ncol(.), ~scales::percent(as.numeric(.), accuracy=.1)) %>% 
  knitr::kable(caption="Tabla de contingencia, Niv. de complejidad (proporción por columna)")
Tabla de contingencia, Niv. de complejidad (proporción por columna)
nivel_de_complejidad 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
Alta Complejidad 2685 (61.4%) 462 (67.9%) 155 (49.5%) 153 (74.6%) 126 (66.7%) 90 (63.4%) 70 (51.1%)
Baja Complejidad 711 (16.3%) 128 (18.8%) 56 (17.9%) 19 (9.3%) 30 (15.9%) 10 (7.0%) 25 (18.2%)
Mediana Complejidad 847 (19.4%) 78 (11.5%) 83 (26.5%) 31 (15.1%) 29 (15.3%) 32 (22.5%) 36 (26.3%)
Pendiente 101 (2.3%) 5 (0.7%) 15 (4.8%) 2 (1.0%) 1 (0.5%) 9 (6.3%) 6 (4.4%)
Sin dato 28 (0.6%) 7 (1.0%) 4 (1.3%) 0 (0.0%) 3 (1.6%) 1 (0.7%) 0 (0.0%)

Tiempo que demora esta sección: 0 minutos

A partir de la tabla de contingencia, se observa que 5939, Un semestre TSM(3) y 5935, TSM, 6 meses después, TSM(2) presentan menores porcentajes de ingresos en establecimientos de Alta complejidad (~50%) y mayores en mediana complejidad (~27%). En contraste, pacientes clasificados en 5989, Comorbilidad un trimestre(4), 6025, Un trimestre, TUS(5) y 6036, TSM, 1 año después, otras causas(7) se encuentran en mayor proporción en establecimientos de Alta complejidad.

Código
tab_clus_compl_pam_om7_q %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 1e-05


chisq_cramerv(tab_clus_compl_pam_om7_q[,-1])
# $chisq_statistic
# [1] "115.32"
# 
# $chisq_df
# df 
# 24 
# 
# $chisq_p_value
# [1] "<0.001"
# 
# $cramers_v
# [1] "0.07"

cat("Descartando valores negativos en sil width")
chisq_cramerv(with(subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, !rn %in% sil_neg_pam_om_clus7_q) %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
  by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first"), table(nivel_de_complejidad, clus_pam_om7)))

chisq.posthoc.test(tab_clus_compl_pam_om7_q[-1]) %>% 
    dplyr::mutate_at(3:ncol(.), ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
    #knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")%>%
    group_by(Dimension) %>%
    summarise(across(2:(ncol(.)-1),
                     ~ paste0(first(sprintf("%1.2f",.)), " (p=", last(sprintf("%1.3f",.)), ")"))) %>%
    dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=0.000)","p<0.001)",.)) %>% 
    #dplyr::mutate_at(2:length(names(.)), ~gsub("p\\=1)","p=1.000)",.)) %>% 
    dplyr::mutate(Dimension= dplyr::pull(tab_clus_compl_pam_om7_q[1])) %>% 
    knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Niv. complejidad")

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided

$chisq_statistic
[1] "115.32"

$chisq_df
df 
24 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.07"

Descartando valores negativos en sil width$chisq_statistic
[1] "122.96"

$chisq_df
df 
24 

$chisq_p_value
[1] "<0.001"

$cramers_v
[1] "0.07"
Comparación post-hoc, conglomerado-Niv. complejidad
Dimension 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2)
Alta Complejidad -1.41 (p=1.000) 3.41 (p=0.023) -4.65 (p<0.001) 3.80 (p=0.005) 1.35 (p=1.000) 0.35 (p=1.000) -2.65 (p=0.282)
Baja Complejidad 0.17 (p=1.000) 1.96 (p=1.000) 0.83 (p=1.000) -2.75 (p=0.212) -0.13 (p=1.000) -3.00 (p=0.094) 0.65 (p=1.000)
Mediana Complejidad 1.80 (p=1.000) -5.20 (p<0.001) 3.58 (p=0.012) -1.38 (p=1.000) -1.24 (p=1.000) 1.15 (p=1.000) 2.26 (p=0.832)
Pendiente 0.07 (p=1.000) -2.89 (p=0.134) 3.02 (p=0.089) -1.29 (p=1.000) -1.65 (p=1.000) 3.25 (p=0.041) 1.64 (p=1.000)
Sin dato -1.07 (p=1.000) 1.04 (p=1.000) 1.22 (p=1.000) -1.23 (p=1.000) 1.45 (p=1.000) -0.01 (p=1.000) -1.00 (p=1.000)

Tiempo que demora esta sección: 0 minutos

Código
pairwise_chisq_gof_test(tab_clus_compl_pam_om7_q[-1], p.adjust.method="holm")|> 
    knitr::kable("markdown", caption="Dependencia categórica sol. 7 conglomerados, por pares de categorías en Niv. Complejidad (corrección Holm-Bonferroni)")
Dependencia categórica sol. 7 conglomerados, por pares de categorías en Niv. Complejidad (corrección Holm-Bonferroni)
n group1 group2 statistic p df p.adj p.adj.signif
5052 6035, Un trimestre, TSM(6) 6025, Un trimestre, TUS(5) 34.662952 5.00e-07 4 8.70e-06 ****
4685 6035, Un trimestre, TSM(6) 5939, Un semestre TSM(3) 23.805080 8.74e-05 4 1.31e-03 **
4577 6035, Un trimestre, TSM(6) 5989, Comorbilidad un trimestre(4) 16.233619 2.72e-03 4 2.99e-02 *
4561 6035, Un trimestre, TSM(6) 6036, TSM, 1 año después, otras causas(7) 7.319126 1.20e-01 4 3.90e-01 ns
4514 6035, Un trimestre, TSM(6) 5710, TSM, 1 año después, TSM(1) 17.278076 1.71e-03 4 2.22e-02 *
4509 6035, Un trimestre, TSM(6) 5935, TSM, 6 meses después, TSM(2) 9.143687 5.76e-02 4 2.88e-01 ns
993 6025, Un trimestre, TUS(5) 5939, Un semestre TSM(3) 59.372519 0.00e+00 4 0.00e+00 ****
885 6025, Un trimestre, TUS(5) 5989, Comorbilidad un trimestre(4) 13.603975 8.67e-03 4 7.79e-02 ns
869 6025, Un trimestre, TUS(5) 6036, TSM, 1 año después, otras causas(7) 3.036705 5.52e-01 4 1.00e+00 ns
822 6025, Un trimestre, TUS(5) 5710, TSM, 1 año después, TSM(1) 42.600717 0.00e+00 4 2.00e-07 ****
817 6025, Un trimestre, TUS(5) 5935, TSM, 6 meses después, TSM(2) 35.563849 4.00e-07 4 6.40e-06 ****
518 5939, Un semestre TSM(3) 5989, Comorbilidad un trimestre(4) 34.927723 5.00e-07 4 8.20e-06 ****
502 5939, Un semestre TSM(3) 6036, TSM, 1 año después, otras causas(7) 19.864466 5.31e-04 4 7.43e-03 **
455 5939, Un semestre TSM(3) 5710, TSM, 1 año después, TSM(1) 12.759106 1.25e-02 4 8.75e-02 ns
450 5939, Un semestre TSM(3) 5935, TSM, 6 meses después, TSM(2) 1.841632 7.65e-01 4 1.00e+00 ns
394 5989, Comorbilidad un trimestre(4) 6036, TSM, 1 año después, otras causas(7) 7.845483 9.74e-02 4 3.90e-01 ns
347 5989, Comorbilidad un trimestre(4) 5710, TSM, 1 año después, TSM(1) 13.607349 8.66e-03 4 7.79e-02 ns
342 5989, Comorbilidad un trimestre(4) 5935, TSM, 6 meses después, TSM(2) 4
331 6036, TSM, 1 año después, otras causas(7) 5710, TSM, 1 año después, TSM(1) 17.221041 1.75e-03 4 2.22e-02 *
326 6036, TSM, 1 año después, otras causas(7) 5935, TSM, 6 meses después, TSM(2) 15.889624 3.17e-03 4 3.17e-02 *
279 5710, TSM, 1 año después, TSM(1) 5935, TSM, 6 meses después, TSM(2) 10.677689 3.04e-02 4 1.82e-01 ns

Tiempo que demora esta sección: 0 minutos

Un análisis de los residuos muestra que hay una mayor proporción de pacientes clasificados en 6025, Un trimestre, TUS(5) y 5989, Comorbilidad un trimestre(4) en establecimientos de alta complejidad, vs. un porcentaje menor de pacientes clasificados en 5939, Un semestre TSM(3) se concentra en establecimientos de alta complejidad. Por otra parte, pacientes clasificados en 5939, Un semestre TSM(3) muestran una mayor proporción en establecimientos de mediana complejidad, mientras que 6025, Un trimestre, TUS(5) presenta una menor proporción en este tipo de establecimientos.

A partir del análisis post-hoc, se identificaron diferencias estadísticamente significativas entre varios pares de grupos, especialmente entre 6025, Un trimestre, TUS(5) y otros conglomerados como 6035, Un trimestre, TSM(6), 5939, Un semestre TSM(3), 5710, TSM, 1 año después, TSM(1) y 5935, TSM, 6 meses después, TSM(2). Esto sugiere que la distribución de los niveles de complejidad en el conglomerado 6025 difiere marcadamente de la de esos grupos. Asimismo, se observaron diferencias relevantes entre 5939, Un semestre TSM(3) y 5989, Comorbilidad un trimestre(4) o 6036, TSM, 1 año después, otras causas(7), lo que indica perfiles de complejidad únicos en cada uno. Por otro lado, ciertos pares no mostraron diferencias significativas (e.g., 6035, Un trimestre, TSM(6) vs 6036, TSM, 1 año después, otras causas(7), 6025, Un trimestre, TUS(5) vs 6036, TSM, 1 año después, otras causas(7)), lo que señala similitudes en sus distribuciones de complejidad.

1.2.4. Compilación comparación covariables

Código
#dput(attr(t(tab_clus_compl_pam_om7_q),"dimnames")[[1]])

# Definir los datos correctamente
data_pam_om7_q <-cbind.data.frame(
  Grupo= c("6035, Un trimestre, TSM(6)", "6025, Un trimestre, TUS(5)", 
"5939, Un semestre TSM(3)", "5989, Comorbilidad un trimestre(4)", 
"6036, TSM, 1 año después, otras causas(7)", "5710, TSM, 1 año después, TSM(1)", 
"5935, TSM, 6 meses después, TSM(2)"), 
      PPOO_bin            = c(NA, NA, NA, NA, NA, NA, NA), 
      PPOO_sinautoid          = c(NA, NA, NA, NA, NA, NA, NA), 
      PPOO_conautoid          = c(NA, NA, NA, NA, NA, NA, NA), 
      Mortalidad              = c(NA, NA, NA, NA, NA, NA, NA), 
      RM                      = c(NA, "-", NA, "+", NA, NA, NA), 
      `Macrozona-Austral`       = c(NA, NA, NA, NA, NA, NA, NA), 
      `Macrozona-Centro`        = c(NA, NA, NA, NA, NA, NA, NA), 
      `Macrozona-Centro Sur`    = c(NA, NA, NA, NA, NA, NA, NA), 
      `Macrozona-Norte`        = c("+","-", NA, NA, NA, NA, NA), 
      `Macrozona-Sur`         = c("-", "+", NA, NA, NA, NA, NA), 
      Sexo_mujeres             = c("+", "-", NA, "-", NA, NA, "+"), 
      `Edad ingreso`         = c(NA, "+", "-", "+", NA, NA, "-"), 
      `Previsión-FFAA`         = c(NA, NA, NA, NA, NA, NA, NA), 
      `Previsión-FONASA A`     = c(NA, NA, NA, NA, NA, NA, NA), 
      `Previsión-FONASA BC`     = c(NA, NA, NA, NA, NA, NA, NA), 
      `Previsión-FONASA D`     = c(NA, NA, NA, NA, NA, NA, NA), 
      `Previsión-ISAPRE`     = c(NA, NA, NA, NA, NA, NA, NA), 
      `NivComp-Baja`     = c(NA, NA, NA, NA, NA, NA, NA), 
      `NivComp-Media`     = c(NA, "-", "+", NA, NA, NA, NA), 
      `NivComp-Alta`     = c(NA, "+", "-", NA, NA, NA, NA))
#
# Asegurar que los nombres de las columnas sean válidos y no haya espacios en blanco
# Derretir el dataframe para que sea adecuado para ggplot2
data_melt_pam_om7_q <- reshape2::melt(data_pam_om7_q, id.vars = 'Grupo', variable.name = 'Variable', value.name = 'Asociación')

# Reemplazar los NA por un valor vacío
data_melt_pam_om7_q$Asociación[is.na(data_melt_pam_om7_q$Asociación)] <- "\n"

# Crear el gráfico con ggplot
data_melt_pam_om7_q %>% 
  dplyr::mutate(Variable = gsub("_", " ", Variable)) %>% 
ggplot(aes(x = Variable, y = Grupo, fill = Asociación)) +
  geom_tile(color = "white", size = 0.8) +
  scale_fill_manual(values = c("+" = "#556B2F", "-" = "#E2725B", "\n" = "white")) +
  labs(title =NULL, x = "Variables", y = "Conglomerado") +
  theme_minimal() +
  theme(#axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid = element_blank())+
  theme(
    axis.text.y = element_text(size = 17, face = "bold"),#,margin = margin(l = 7)),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 17, face = "bold", angle = 45, hjust = 1),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 16, face = "bold"),#,margin = margin(t = -15)),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 16, face = "bold"),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 17, face = "bold"),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 15, face = "bold")            # Tamaño del texto de la leyenda
  ) +
  coord_flip()
ggsave("_figs/asociaciones_pam_om7_q.png", width=8.8*.8, height=5*.8, dpi=1000)
Comparación covariables con agrupamiento

Comparación covariables con agrupamiento

Tiempo que demora esta sección: 0.1 minutos


Información de la sesión

Código
cat(paste0("R library: ", Sys.getenv("R_LIBS_USER")))
R library: C:\Users\andre\AppData\Local/R/win-library/4.4
Código
cat(paste0("Date: ",withr::with_locale(new = c('LC_TIME' = 'C'), code =Sys.time())))
Date: 2025-01-27 15:06:56.473447
Código
cat(paste0("Editor context: ", getwd()))
Editor context: H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II
Código
save.image("avance250117_2.RData")

Tiempo que demora esta sección: 0.2 minutos

Código
sesion_info <- devtools::session_info()
dplyr::select(
  tibble::as_tibble(sesion_info$packages),
  c(package, loadedversion, source)
) %>% 
 knitr::kable(caption = "R packages", format = "html",
      col.names = c("Row number", "Package", "Version"),
    row.names = FALSE,
      align = c("c", "l", "r")) %>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
R packages
Row number Package Version
abind 1.4-5 CRAN (R 4.4.0)
backports 1.5.0 CRAN (R 4.4.0)
biostat3 0.1.9 CRAN (R 4.4.1)
boot 1.3-30 CRAN (R 4.4.0)
broom 1.0.6 CRAN (R 4.4.0)
cachem 1.1.0 CRAN (R 4.4.0)
car 3.1-2 CRAN (R 4.4.1)
carData 3.0-5 CRAN (R 4.4.1)
chisq.posthoc.test 0.1.3 Github (ebbertd/chisq.posthoc.test@186d2ca6bbdba9fc19601aff4696ae1b85e7e0b0)
cli 3.6.3 CRAN (R 4.4.1)
cluster 2.1.6 CRAN (R 4.4.0)
coda 0.19-4.1 CRAN (R 4.4.1)
codetools 0.2-20 CRAN (R 4.4.0)
colorspace 2.1-0 CRAN (R 4.4.0)
cowplot 1.1.3 CRAN (R 4.4.1)
crayon 1.5.3 CRAN (R 4.4.2)
curl 6.0.1 CRAN (R 4.4.2)
data.table 1.15.4 CRAN (R 4.4.0)
devtools 2.4.5 CRAN (R 4.4.1)
DiagrammeR 1.0.11 CRAN (R 4.4.0)
DiagrammeRsvg 0.1 CRAN (R 4.4.1)
digest 0.6.37 CRAN (R 4.4.0)
doFuture 1.0.1 CRAN (R 4.4.0)
doParallel 1.0.17 CRAN (R 4.4.0)
dplyr 1.1.4 CRAN (R 4.4.0)
ellipsis 0.3.2 CRAN (R 4.4.0)
emmeans 1.10.3 CRAN (R 4.4.1)
epitools 0.5-10.1 CRAN (R 4.4.0)
estimability 1.5.1 CRAN (R 4.4.1)
evaluate 1.0.1 CRAN (R 4.4.2)
expsmooth 2.3 CRAN (R 4.4.1)
factoextra 1.0.7 CRAN (R 4.4.1)
fansi 1.0.6 CRAN (R 4.4.0)
farver 2.1.2 CRAN (R 4.4.0)
fastmap 1.2.0 CRAN (R 4.4.0)
fma 2.5 CRAN (R 4.4.1)
forcats 1.0.0 CRAN (R 4.4.0)
foreach 1.5.2 CRAN (R 4.4.0)
forecast 8.23.0 CRAN (R 4.4.1)
fpp2 2.5 CRAN (R 4.4.1)
fracdiff 1.5-3 CRAN (R 4.4.1)
fs 1.6.5 CRAN (R 4.4.2)
future 1.33.2 CRAN (R 4.4.0)
future.apply 1.11.2 CRAN (R 4.4.0)
generics 0.1.3 CRAN (R 4.4.0)
ggh4x 0.2.8 CRAN (R 4.4.1)
ggplot2 3.5.1 CRAN (R 4.4.0)
ggpubr 0.6.0 CRAN (R 4.4.1)
ggrepel 0.9.5 CRAN (R 4.4.1)
ggseqplot 0.8.4 CRAN (R 4.4.1)
ggsignif 0.6.4 CRAN (R 4.4.1)
globals 0.16.3 CRAN (R 4.4.0)
glue 1.8.0 CRAN (R 4.4.2)
gridExtra 2.3 CRAN (R 4.4.0)
gtable 0.3.5 CRAN (R 4.4.0)
gtsummary 2.0.2 CRAN (R 4.4.1)
haven 2.5.4 CRAN (R 4.4.0)
hms 1.1.3 CRAN (R 4.4.0)
htmltools 0.5.8 CRAN (R 4.4.0)
htmlwidgets 1.6.4 CRAN (R 4.4.0)
httpuv 1.6.15 CRAN (R 4.4.0)
iterators 1.0.14 CRAN (R 4.4.0)
janitor 2.2.0 CRAN (R 4.4.0)
job 0.3.1 CRAN (R 4.4.1)
jsonlite 1.8.9 CRAN (R 4.4.2)
kableExtra 1.4.0 CRAN (R 4.4.1)
km.ci 0.5-6 CRAN (R 4.4.2)
KMsurv 0.1-5 CRAN (R 4.4.0)
knitr 1.49 CRAN (R 4.4.2)
labeling 0.4.3 CRAN (R 4.4.0)
later 1.4.1 CRAN (R 4.4.2)
lattice 0.22-6 CRAN (R 4.4.0)
lifecycle 1.0.4 CRAN (R 4.4.0)
listenv 0.9.1 CRAN (R 4.4.0)
lmtest 0.9-40 CRAN (R 4.4.1)
lubridate 1.9.3 CRAN (R 4.4.0)
magrittr 2.0.3 CRAN (R 4.4.0)
MASS 7.3-60.2 local
Matrix 1.7-0 CRAN (R 4.4.0)
memoise 2.0.1 CRAN (R 4.4.0)
mgcv 1.9-1 CRAN (R 4.4.0)
mime 0.12 CRAN (R 4.4.0)
miniUI 0.1.1.1 CRAN (R 4.4.0)
muhaz 1.2.6.4 CRAN (R 4.4.1)
multcomp 1.4-26 CRAN (R 4.4.0)
munsell 0.5.1 CRAN (R 4.4.0)
mvtnorm 1.2-5 CRAN (R 4.4.0)
NbClust 3.0.1 CRAN (R 4.4.0)
nlme 3.1-164 CRAN (R 4.4.0)
nnet 7.3-19 CRAN (R 4.4.0)
pacman 0.5.1 CRAN (R 4.4.1)
parallelly 1.37.1 CRAN (R 4.4.0)
patchwork 1.2.0 CRAN (R 4.4.1)
permute 0.9-7 CRAN (R 4.4.0)
pillar 1.9.0 CRAN (R 4.4.0)
pkgbuild 1.4.5 CRAN (R 4.4.2)
pkgconfig 2.0.3 CRAN (R 4.4.0)
pkgload 1.4.0 CRAN (R 4.4.2)
plyr 1.8.9 CRAN (R 4.4.0)
profvis 0.4.0 CRAN (R 4.4.2)
progressr 0.14.0 CRAN (R 4.4.0)
promises 1.3.2 CRAN (R 4.4.2)
purrr 1.0.2 CRAN (R 4.4.0)
quadprog 1.5-8 CRAN (R 4.4.0)
quantmod 0.4.26 CRAN (R 4.4.1)
R6 2.5.1 CRAN (R 4.4.0)
ragg 1.3.3 CRAN (R 4.4.2)
rbibutils 2.2.16 CRAN (R 4.4.1)
RColorBrewer 1.1-3 CRAN (R 4.4.0)
Rcpp 1.0.13 CRAN (R 4.4.1)
Rdpack 2.6 CRAN (R 4.4.1)
readr 2.1.5 CRAN (R 4.4.0)
remotes 2.5.0 CRAN (R 4.4.0)
reshape2 1.4.4 CRAN (R 4.4.0)
rio 1.1.1 CRAN (R 4.4.0)
rlang 1.1.4 CRAN (R 4.4.0)
rmarkdown 2.29 CRAN (R 4.4.2)
rstatix 0.7.2 CRAN (R 4.4.1)
rstudioapi 0.17.1 CRAN (R 4.4.2)
rsvg 2.6.0 CRAN (R 4.4.0)
sandwich 3.1-0 CRAN (R 4.4.1)
scales 1.3.0 CRAN (R 4.4.0)
sessioninfo 1.2.2 CRAN (R 4.4.0)
shiny 1.9.1 CRAN (R 4.4.2)
snakecase 0.11.1 CRAN (R 4.4.0)
stargazer 5.2.3 CRAN (R 4.4.0)
stringi 1.8.4 CRAN (R 4.4.0)
stringr 1.5.1 CRAN (R 4.4.0)
survival 3.5-8 CRAN (R 4.4.0)
survminer 0.5.0 CRAN (R 4.4.2)
survMisc 0.5.6 CRAN (R 4.4.2)
svglite 2.1.3 CRAN (R 4.4.1)
systemfonts 1.1.0 CRAN (R 4.4.0)
textshaping 0.4.0 CRAN (R 4.4.0)
TH.data 1.1-2 CRAN (R 4.4.1)
tibble 3.2.1 CRAN (R 4.4.0)
tidyr 1.3.1 CRAN (R 4.4.0)
tidyselect 1.2.1 CRAN (R 4.4.0)
tidyverse 2.0.0 CRAN (R 4.4.0)
timechange 0.3.0 CRAN (R 4.4.0)
timeDate 4032.109 CRAN (R 4.4.0)
Tmisc 1.0.1 CRAN (R 4.4.1)
TraMineR 2.2-10 CRAN (R 4.4.0)
TraMineRextras 0.6.7 CRAN (R 4.4.0)
tseries 0.10-58 CRAN (R 4.4.1)
TTR 0.24.4 CRAN (R 4.4.1)
tzdb 0.4.0 CRAN (R 4.4.0)
urca 1.3-4 CRAN (R 4.4.1)
urlchecker 1.0.1 CRAN (R 4.4.0)
usethis 3.1.0 CRAN (R 4.4.2)
utf8 1.2.4 CRAN (R 4.4.0)
V8 4.4.2 CRAN (R 4.4.0)
vctrs 0.6.5 CRAN (R 4.4.0)
vegan 2.6-6.1 CRAN (R 4.4.0)
viridisLite 0.4.2 CRAN (R 4.4.0)
visNetwork 2.1.2 CRAN (R 4.4.0)
WeightedCluster 1.6-4 CRAN (R 4.4.0)
withr 3.0.2 CRAN (R 4.4.2)
xfun 0.49 CRAN (R 4.4.2)
xml2 1.3.6 CRAN (R 4.4.0)
xtable 1.8-4 CRAN (R 4.4.0)
xts 0.14.0 CRAN (R 4.4.1)
yaml 2.3.10 CRAN (R 4.4.1)
zoo 1.8-12 CRAN (R 4.4.0)

Tiempo que demora esta sección: 0 minutos

Código
reticulate::py_list_packages()%>% 
 knitr::kable(caption = "Python packages", format = "html",
      col.names = c("Package", "Version", "Requirement"),
    row.names = FALSE,
      align = c("c", "l", "r", "r"))%>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
Python packages
Package Version Requirement
absl-py 2.1.0 absl-py==2.1.0
asttokens 2.4.1 asttokens==2.4.1
astunparse 1.6.3 astunparse==1.6.3
audioconverter 2.0.3 audioconverter==2.0.3
autograd 1.6.2 autograd==1.6.2
autograd-gamma 0.5.0 autograd-gamma==0.5.0
beautifulsoup4 4.12.3 beautifulsoup4==4.12.3
Brotli 1.1.0 Brotli==1.1.0
certifi 2023.11.17 certifi==2023.11.17
cffi 1.16.0 cffi==1.16.0
charset-normalizer 3.3.2 charset-normalizer==3.3.2
clarabel 0.9.0 clarabel==0.9.0
click 8.1.7 click==8.1.7
cloudpickle 3.0.0 cloudpickle==3.0.0
colorama 0.4.6 colorama==0.4.6
comm 0.2.1 comm==0.2.1
contourpy 1.2.0 contourpy==1.2.0
cvxopt 1.3.2 cvxopt==1.3.2
cvxpy 1.5.2 cvxpy==1.5.2
cycler 0.12.1 cycler==0.12.1
debugpy 1.8.0 debugpy==1.8.0
decorator 4.4.2 decorator==4.4.2
delete-chrome-history-py 0.1.8 delete-chrome-history-py==0.1.8
easyocr 1.7.1 easyocr==1.7.1
ecos 2.0.13 ecos==2.0.13
editdistance 0.8.1 editdistance==0.8.1
efficientnet 1.0.0 efficientnet==1.0.0
essential-generators 1.0 essential-generators==1.0
et-xmlfile 1.1.0 et-xmlfile==1.1.0
executing 2.0.1 executing==2.0.1
fancyimpute 0.7.0 fancyimpute==0.7.0
ffmpeg 1.4 ffmpeg==1.4
ffmpeg-python 0.2.0 ffmpeg-python==0.2.0
filedir 0.0.3 filedir==0.0.3
filelock 3.13.1 filelock==3.13.1
flatbuffers 24.3.25 flatbuffers==24.3.25
fonttools 4.47.2 fonttools==4.47.2
formulaic 1.0.1 formulaic==1.0.1
fsspec 2023.12.2 fsspec==2023.12.2
future 0.18.3 future==0.18.3
gast 0.6.0 gast==0.6.0
git-filter-repo 2.45.0 git-filter-repo==2.45.0
google-pasta 0.2.0 google-pasta==0.2.0
graphviz 0.20.3 graphviz==0.20.3
grpcio 1.65.4 grpcio==1.65.4
gTTS 2.5.1 gTTS==2.5.1
h5py 3.11.0 h5py==3.11.0
idna 3.6 idna==3.6
imageio 2.34.2 imageio==2.34.2
imageio-ffmpeg 0.5.1 imageio-ffmpeg==0.5.1
imgaug 0.4.0 imgaug==0.4.0
iniconfig 2.0.0 iniconfig==2.0.0
interface-meta 1.3.0 interface-meta==1.3.0
ipykernel 6.29.5 ipykernel==6.29.5
ipython 8.20.0 ipython==8.20.0
jedi 0.19.1 jedi==0.19.1
Jinja2 3.1.3 Jinja2==3.1.3
joblib 1.4.0 joblib==1.4.0
jupyter_client 8.6.0 jupyter_client==8.6.0
jupyter_core 5.7.1 jupyter_core==5.7.1
keras 3.4.1 keras==3.4.1
Keras-Applications 1.0.8 Keras-Applications==1.0.8
keras-ocr 0.9.3 keras-ocr==0.9.3
kiwisolver 1.4.5 kiwisolver==1.4.5
knnimpute 0.1.0 knnimpute==0.1.0
lazy_loader 0.4 lazy_loader==0.4
libclang 18.1.1 libclang==18.1.1
lifelines 0.28.0 lifelines==0.28.0
llvmlite 0.41.1 llvmlite==0.41.1
Markdown 3.6 Markdown==3.6
markdown-it-py 3.0.0 markdown-it-py==3.0.0
MarkupSafe 2.1.4 MarkupSafe==2.1.4
matplotlib 3.8.2 matplotlib==3.8.2
matplotlib-inline 0.1.6 matplotlib-inline==0.1.6
mdurl 0.1.2 mdurl==0.1.2
mido 1.3.3 mido==1.3.3
ml-dtypes 0.4.0 ml-dtypes==0.4.0
more-itertools 10.2.0 more-itertools==10.2.0
moviepy 1.0.3 moviepy==1.0.3
mpmath 1.3.0 mpmath==1.3.0
multipledispatch 1.0.0 multipledispatch==1.0.0
mutagen 1.47.0 mutagen==1.47.0
namex 0.0.8 namex==0.0.8
natsort 8.4.0 natsort==8.4.0
nest-asyncio 1.5.9 nest-asyncio==1.5.9
networkx 3.2.1 networkx==3.2.1
ninja 1.11.1.1 ninja==1.11.1.1
nose 1.3.7 nose==1.3.7
numba 0.58.1 numba==0.58.1
numexpr 2.10.0 numexpr==2.10.0
numpy 1.26.3 numpy==1.26.3
openai-whisper 20231117 openai-whisper==20231117
opencv-python 4.10.0.84 opencv-python==4.10.0.84
opencv-python-headless 4.10.0.84 opencv-python-headless==4.10.0.84
openpyxl 3.1.4 openpyxl==3.1.4
opt-einsum 3.3.0 opt-einsum==3.3.0
optree 0.12.1 optree==0.12.1
osqp 0.6.5 osqp==0.6.5
packaging 23.2 packaging==23.2
pandas 2.2.0 pandas==2.2.0
pandas-flavor 0.6.0 pandas-flavor==0.6.0
parso 0.8.3 parso==0.8.3
patsy 0.5.6 patsy==0.5.6
pillow 10.2.0 pillow==10.2.0
platformdirs 4.1.0 platformdirs==4.1.0
pluggy 1.5.0 pluggy==1.5.0
polars 1.9.0 polars==1.9.0
proglog 0.1.10 proglog==0.1.10
prompt-toolkit 3.0.43 prompt-toolkit==3.0.43
protobuf 4.25.4 protobuf==4.25.4
psutil 5.9.8 psutil==5.9.8
pure-eval 0.2.2 pure-eval==0.2.2
pyarrow 15.0.0 pyarrow==15.0.0
pyclipper 1.3.0.post5 pyclipper==1.3.0.post5
pycparser 2.22 pycparser==2.22
pycryptodomex 3.20.0 pycryptodomex==3.20.0
pydotplus 2.0.2 pydotplus==2.0.2
pydub 0.24.1 pydub==0.24.1
Pygments 2.17.2 Pygments==2.17.2
pyjanitor 0.26.0 pyjanitor==0.26.0
PyMuPDF 1.24.9 PyMuPDF==1.24.9
PyMuPDFb 1.24.9 PyMuPDFb==1.24.9
pyparsing 3.1.1 pyparsing==3.1.1
PyPDF2 3.0.1 PyPDF2==3.0.1
pyreadr 0.5.0 pyreadr==0.5.0
pytesseract 0.3.10 pytesseract==0.3.10
pytest 8.3.1 pytest==8.3.1
python-bidi 0.6.0 python-bidi==0.6.0
python-dateutil 2.8.2 python-dateutil==2.8.2
pytube 15.0.0 pytube==15.0.0
pytube3 9.6.4 pytube3==9.6.4
pytz 2023.3.post1 pytz==2023.3.post1
pywin32 306 pywin32==306
PyYAML 6.0.1 PyYAML==6.0.1
pyzmq 25.1.2 pyzmq==25.1.2
qdldl 0.1.7.post1 qdldl==0.1.7.post1
regex 2023.12.25 regex==2023.12.25
requests 2.32.3 requests==2.32.3
rich 13.7.1 rich==13.7.1
rpy2 3.5.16 rpy2==3.5.16
scikit-image 0.24.0 scikit-image==0.24.0
scikit-learn 1.3.2 scikit-learn==1.3.2
scikit-survival 0.22.2 scikit-survival==0.22.2
scipy 1.11.4 scipy==1.11.4
scs 3.2.6 scs==3.2.6
seaborn 0.13.2 seaborn==0.13.2
semantic-version 2.10.0 semantic-version==2.10.0
setuptools-rust 1.8.1 setuptools-rust==1.8.1
shapely 2.0.5 shapely==2.0.5
six 1.16.0 six==1.16.0
soupsieve 2.5 soupsieve==2.5
SpeechRecognition 3.10.1 SpeechRecognition==3.10.1
spyder-kernels 3.0.2 spyder-kernels==3.0.2
stack-data 0.6.3 stack-data==0.6.3
statsmodels 0.14.1 statsmodels==0.14.1
sympy 1.12 sympy==1.12
target 0.0.11 target==0.0.11
tensorboard 2.17.0 tensorboard==2.17.0
tensorboard-data-server 0.7.2 tensorboard-data-server==0.7.2
tensorflow 2.17.0 tensorflow==2.17.0
tensorflow-intel 2.17.0 tensorflow-intel==2.17.0
tensorflow-io-gcs-filesystem 0.31.0 tensorflow-io-gcs-filesystem==0.31.0
termcolor 2.4.0 termcolor==2.4.0
threadpoolctl 3.4.0 threadpoolctl==3.4.0
tifffile 2024.7.24 tifffile==2024.7.24
tiktoken 0.5.2 tiktoken==0.5.2
torch 2.4.0 torch==2.4.0
torchaudio 2.4.0 torchaudio==2.4.0
torchvision 0.19.0 torchvision==0.19.0
tornado 6.4 tornado==6.4
tqdm 4.66.1 tqdm==4.66.1
traitlets 5.14.1 traitlets==5.14.1
translator 0.0.9 translator==0.0.9
typing_extensions 4.9.0 typing_extensions==4.9.0
tzdata 2023.4 tzdata==2023.4
tzlocal 5.2 tzlocal==5.2
urllib3 2.1.0 urllib3==2.1.0
validators 0.33.0 validators==0.33.0
watchdog 3.0.0 watchdog==3.0.0
wcwidth 0.2.13 wcwidth==0.2.13
websockets 12.0 websockets==12.0
Werkzeug 3.0.3 Werkzeug==3.0.3
whisper 1.1.10 whisper==1.1.10
wrapt 1.16.0 wrapt==1.16.0
xarray 2024.1.1 xarray==2024.1.1
youtube-dl 2021.12.17 youtube-dl==2021.12.17
yt-dlp 2024.7.9 yt-dlp==2024.7.9

Tiempo que demora esta sección: 0.1 minutos